Проблема с синхронизацией хранения конденсатора

#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 разрешении, но затем исходная функция уже возвращается