Подождите, пока асинхронный не будет завершен (ждать) - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь разобраться с асинхронностью / ожиданием

Я использую https://github.com/sunnylqm/react-native-storage для своего проекта в реагирующем языке.

Я использую асинхронное хранилище для хранения нескольких важных данных, таких как выбранный языковой стандарт пользователя, мне нужно получить это значение до того, как экран будет отображен на экране в зависимости от выбранного языкового стандарта.

Я попытался реализовать несколько вспомогательных функций, они работают с обратным вызовом, мне нужно вернуть значение вместо обратного вызова и подождать, пока значение не будет получено. Ниже приведено несколько примеров, которые я попробовал.

// 1
_selectedLocale = async () => {
  try {
    const value = await global.storage.load({key: 'selectedLocale'});
    return value
   } catch (error) {
     console.log(value)
   }
}
var selectedLocale = _selectedLocale();

// 2
export async function _selectedLocale() {
  return storage.load({key: 'selectedLocale'});
}
var selectedLocale = _selectedLocale();
// 3
export function selectedLocale(callback) {
  storage.load({key: 'selectedLocale'}).catch(e => {
    callback(RNLanguages.language);
  }).then(function(locale) {
    callback(locale);
  });
}

Это не работает, я смотрю на

  1. Реализация вспомогательной функции для получения значения на основе ключа
  2. Дождаться получения значения (синхронизация)

Может ли кто-нибудь указать мне правильное направление

Спасибо

Update1:

Вот как я использую обратный вызов

selectedLocale(function(locale) {
  global.layoutIsRTL = 'ar' == locale;
  ReactNative.I18nManager.allowRTL(true);
  global.i18n.locale = locale
});

UPDATE2:

Кажется, кто-то уже сделал это, вот ссылка https://github.com/sunnylqm/react-native-storage/issues/206 к сожалению, мне трудно это понять.

1 Ответ

0 голосов
/ 04 января 2019

async неявно возвращает обещание, поэтому вам нужно также дождаться вызова функции, если вы хотите получить значение там:

var selectedLocale = await _selectedLocale();

но вы можете сделать это только внутри другой async функции

...