У меня возникли проблемы с попыткой получить элемент из 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",
Оператор return
возвращается из функции value => {}
, а не из функции getItem()
. Чтобы вернуться из функции getItem()
, оператор return
НЕ МОЖЕТ находиться внутри другой функции (это означает, что он должен находиться вне .then()
). Как видите, вы поставили себя в безвыходную ситуацию. Правильное решение — либо передать обратный вызов getItem()
, либо удалить .then()
и выполнить return AsyncStorage.getItem()
.
ваш getItem
ничего не возвращает. И даже если бы это было так (например, с помощью return AsyncStorage.getItem(...).then(...)
, оно вернуло бы обещание, которое затем вам придется снова либо await getItem()
, либо использовать getItem().then(...)
Я так не думаю. Думаю, я правильно использую метод Promise.then, не так ли? Если я делаю код с асинхронным ожиданием, он работает хорошо. Это ограничение AsyncStorage? Это работает только с асинхронным ожиданием? Или я что-то упускаю?
@slebetman Даже если у getItem
был return AsyncStorage.getItem(...)
ОП, он тоже не использует getItem
правильно, потому что не ждет его результата...
Также читайте stackoverflow.com/questions/23667086/…
Посмотрите версию редактирования. «Второе печатается первым....
Ну, конечно, так, потому что вы не ждете ответа от обещания .then(...)
Два вопроса, которые я связал для справки, подробно объясняют, как работает асинхронный код. Прочтите их внимательно, и вы наверняка заметите, что делаете не так. Нет смысла объяснять все это здесь еще раз.
«Думаю, я правильно использую метод Promise.then, не так ли?» Нет, это не так, ни в исходном коде, ни в обновленном коде. Прочтите связанные вопросы, чтобы понять, почему...
Извините ребята. Теперь я понимаю. Я думал, что с "тогда" ответа ждать не надо. Я могу работать только внутри функции «то». Виноват.
В вашем случае я предлагаю вернуть 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
Отвечает ли это на ваш вопрос? Как вернуть ответ на асинхронный вызов?