#angular #ionic-framework #local-storage
Вопрос:
Я пытаюсь получить данные для хранения в функции, которая возвращает константу. Однако, если хранилище не задано, вместо него следует использовать другие данные.
Проблема, с которой я сталкиваюсь, заключается в том, что используются «другие» данные, поскольку хранилище еще не вернуло информацию.
Перемещение всей функции в .then() вызывает проблему: «Функция, объявленный тип которой не является ни «пустым», ни «любым», должна возвращать значение.ts». Я не могу понять, как это должно быть решено.
generateMap(id: string, zoom: number): L.Map {
let current_position = {
latitude: 52.3702157,
longitude: 4.8951679
}
Storage.get({ key: 'current_position' }).then((result) => {
if (result.value != null) {
current_position = JSON.parse(result.value);
}
});
const map = L.map(id,
{
zoom: zoom,
center: latLng({ lat: current_position.latitude, lng: current_position.longitude }),
});
return map;
}
Ответ №1:
Вы должны вернуть свой Promise
из функции (и вместе с ней изменить тип возвращаемого значения):
generateMap(id: string, zoom: number): Promise<L.Map> {
let current_position = {
latitude: 52.3702157,
longitude: 4.8951679
}
return Storage.get({ key: 'current_position' }).then((result) => {
if (result.value != null) {
current_position = JSON.parse(result.value);
}
return L.map(id,
{
zoom: zoom,
center: latLng({
lat: current_position.latitude,
lng: current_position.longitude
}),
});
});
}
Который вам придется назвать так:
generateMap(id, zoom).then((map) => {
// here you'll have your map
});
Вы также можете использовать async/await
, но это просто синтаксический сахар, так как ваш возвращаемый тип всегда будет a Promise
, однако это повысит читабельность кода:
async generateMap(id: string, zoom: number): Promise<L.Map> {
const { value } = await Storage.get({ key: 'current_position' });
const currentPosition = value != null
? JSON.parse(value)
: { latitude: 52.3702157, longitude: 4.8951679 };
return L.map(id,{
zoom: zoom,
center: latLng({
lat: currentPosition.latitude,
lng: currentPosition.longitude
}),
});
}
Комментарии:
1. Я подумал о том же, но проблема «Функция, объявленный тип которой не является ни» пустым», ни «любым», должна возвращать значение.ts » сохраняется при использовании вашего первого метода. Таким образом, это не работает.
2. @S_NoBEl это просто означает, что вы забыли добавить
return
передPromise
3. Извините, я не понимаю. константа карты обрабатывается далее по мере того, как функция упрощается по сравнению с реальностью. Вы имеете в виду возвращение на карту Лос-Анджелеса?
4. @S_NoBEl да, это так. Вы не можете продолжить функцию, потому что все, что находится внутри
.then
, будет выполнено после того, что вы поместили под ним. JavaScript-это язык, управляемый асинхронными событиями, и порядок выполнения не является прямым. Вы можете сделать это более понятным сasync/await
помощью обозначения5. @S_NoBEl итак, чтобы было ясно, если вы посмотрите на свой код, оператор if
if (result.value != null) {
внутри.then
выполняется послеreturn map;
. Это потому, что вы передаете функцию в.then
вызове, и она вызывается приStorage.get
разрешении, но затем исходная функция уже возвращается