AsyncStorage не ждет с «then» в React Native

У меня возникли проблемы с попыткой получить элемент из AsyncStorage в React Native без преобразования его в асинхронную функцию и использования ожидания.

Основываясь на этом ответе, я пытался сделать что-то вроде этого:

const getItem = (key) => {  
  AsyncStorage.getItem("access_token").then(value=>{
    console.info(value, " first")
    return value
  });
};

const test = () => {
  const teste = getItem()
  console.info(teste, " final"); 
}

Сумасшествие заключается в том, что при вызове тестовой функции (например, в событии onPress) я печатаю следующее:

LOG  undefined  final
LOG  00b3ceb97ae8d9357abd1065f50be408a9389f23  first

Последний журнал, который должен отображаться в конце, печатается первым и не определен.

Редактировать:

Еще одна попытка:

const getItem = (key) => {  
  const value = AsyncStorage.getItem("access_token").then(value=>{
    console.info(value, " first")
    return value
  });

  console.info(value, " second")

};

Это журнал:

LOG  {"_h": 0, "_i": 0, "_j": null, "_k": null}  second
LOG  00b3ceb97ae8d9357abd1065f50be408a9389f23  first

Я что-то упускаю? Можно ли использовать «то» для получения данных с помощью библиотеки AsyncStorage без механизма асинхронного ожидания?

"react-native": "0.73.6" и "@react-native-async-storage/async-storage": "^1.23.1",

Отвечает ли это на ваш вопрос? Как вернуть ответ на асинхронный вызов?

derpirscher 19.04.2024 00:58

Оператор return возвращается из функции value => {}, а не из функции getItem(). Чтобы вернуться из функции getItem(), оператор return НЕ МОЖЕТ находиться внутри другой функции (это означает, что он должен находиться вне .then()). Как видите, вы поставили себя в безвыходную ситуацию. Правильное решение — либо передать обратный вызов getItem(), либо удалить .then() и выполнить return AsyncStorage.getItem().

slebetman 19.04.2024 01:00

ваш getItem ничего не возвращает. И даже если бы это было так (например, с помощью return AsyncStorage.getItem(...).then(...), оно вернуло бы обещание, которое затем вам придется снова либо await getItem(), либо использовать getItem().then(...)

derpirscher 19.04.2024 01:00

Я так не думаю. Думаю, я правильно использую метод Promise.then, не так ли? Если я делаю код с асинхронным ожиданием, он работает хорошо. Это ограничение AsyncStorage? Это работает только с асинхронным ожиданием? Или я что-то упускаю?

Cristian Favaro Carriço 19.04.2024 01:02

@slebetman Даже если у getItem был return AsyncStorage.getItem(...) ОП, он тоже не использует getItem правильно, потому что не ждет его результата...

derpirscher 19.04.2024 01:04

Также читайте stackoverflow.com/questions/23667086/…

derpirscher 19.04.2024 01:05

Посмотрите версию редактирования. «Второе печатается первым....

Cristian Favaro Carriço 19.04.2024 01:05

Ну, конечно, так, потому что вы не ждете ответа от обещания .then(...) Два вопроса, которые я связал для справки, подробно объясняют, как работает асинхронный код. Прочтите их внимательно, и вы наверняка заметите, что делаете не так. Нет смысла объяснять все это здесь еще раз.

derpirscher 19.04.2024 01:05

«Думаю, я правильно использую метод Promise.then, не так ли?» Нет, это не так, ни в исходном коде, ни в обновленном коде. Прочтите связанные вопросы, чтобы понять, почему...

derpirscher 19.04.2024 01:08

Извините ребята. Теперь я понимаю. Я думал, что с "тогда" ответа ждать не надо. Я могу работать только внутри функции «то». Виноват.

Cristian Favaro Carriço 19.04.2024 01:10
Умерло ли Create-React-App?
Умерло ли Create-React-App?
В этом документальном фильме React.dev мы исследуем, мертв ли Create React App (CRA) и какое будущее ждет этот популярный фреймворк React.
Освоение React Native: Пошаговое руководство для начинающих
Освоение React Native: Пошаговое руководство для начинающих
React Native - это популярный фреймворк с открытым исходным кодом, используемый для разработки мобильных приложений. Он был разработан компанией...
В чем разница между react native и react ?
В чем разница между react native и react ?
React и React Native - два популярных фреймворка для создания пользовательских интерфейсов, но они предназначены для разных платформ. React - это...
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
Хуки React: что это такое и как их использовать
Хуки React: что это такое и как их использовать
Хуки React - это мощная функция библиотеки React, которая позволяет разработчикам использовать состояние и другие возможности React без написания...
0
10
77
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В вашем случае я предлагаю вернуть Promise из getItem и использовать then после:

const getItem = (key) => {  
  return AsyncStorage.getItem("access_token").then(value => {
    console.info(value, " first");
    return value
  });
};

const test = () => {
  getItem().then((value) => console.info(value, " final"));
}
Ответ принят как подходящий

У меня было полное непонимание употребления слова «тогда». Я подумал, что с ним мне не придется ждать и использовать ответ снаружи.

const getItem = (key) => {  
  const value = AsyncStorage.getItem("access_token").then(value=>{
    // here i can use it without wait. To set a useState, for instance.
    return value
  });
  console.info(value) // this is not gonna work.
};

Спасибо, @derpirscher и @slebetman

Другие вопросы по теме