Что может произойти, если я вызову `AsyncStorage.setItem` без ожидания в не асинхронной функции? - PullRequest
0 голосов
/ 12 сентября 2018

Я использую метод fetch для получения некоторых данных с сервера. Как только я получу эти данные, мне нужно будет сохранить некоторые из них (точнее, access_token, потому что я использую oauth) в AsyncStorage. Я попытался сделать AsyncStorage.setItem без ожидания, а не так, как показано в https://facebook.github.io/react-native/docs/asyncstorage,, и все заработало просто отлично.

Я изменил его на:

fetch ('site/login', POST ...)
.then((response) => response.json())
.then(async(responseJson) => {
   if (user.valid)
    await AsyncStorage.setItem('access_token', responseJson.token);

И это тоже отлично работает. Но у меня сейчас 2 вопроса:

Верна ли моя реализация с fetch и async?

А что может произойти, если я не использую await / async в этом случае?

Извините, я немного новичок в Обещаниях и асинхронных методах в Javascript. Спасибо!

1 Ответ

0 голосов
/ 12 сентября 2018

async/await - это просто синтаксический сахар над Обещаниями.Вы уже используете Обещания, поэтому нет необходимости делать это.Просто верните Обещание:

fetch ('site/login', POST ...)
.then((response) => response.json())
.then((responseJson) => {
  if (user.valid) { // not sure where 'user' came from, but whatever
    return AsyncStorage.setItem('access_token', responseJson.token);
  } else {
    throw new Error('Invalid user');
  }
})
.then(_ => { // storage set, don't care about return value
  // do stuff
})
.catch((err) => {
  // handle error, including invalid user
});

Ответ на вопрос в комментариях

Вышеприведенное в async / await будет выглядеть так:

async function foo() {
  try {
    const response = await fetch('site/login', POST ...);
    const responseJson = await response.json();
    if (user.valid) {
      return await AsyncStorage.setItem('access_token', responseJson.token);
    } else {
      throw new Error('Invalid user');
    }
  } catch (error) {
    // deal with errors
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...