我试图弄清楚如何返回承诺的结果。我一直在这里关注React Native文档AsyncStorage页面:https://facebook.github.io/react-native/docs/asyncstorage
我正在使用文档中提供的代码段,并做了一些自己的修改,以尝试访问数据。
正如您在示例中看到的那样,我提供了一个尝试声明一个空数组并用AsyncStorage调用的结果填充它的方法。
export const loadLocalData = async () => {
var itemsStoredLocally = [];
AsyncStorage.getAllKeys((err, keys) => {
AsyncStorage.multiGet(keys, (err, stores) => {
stores.map((result, i, store) => {
let key = store[i][0];
let value = store[i][1];
console.log("Inside the method : ", result)
itemsStoredLocally.push(result);
});
});
})
console.log("Outside the method: ", itemsStoredLocally);
return itemsStoredLocally;
}
在我的控制台中,我得到这个:
Outside the method: Array []
Inside the method : Array [
"1234",
"The data stored locally",
]
我真正想看到的是:
Inside the method : Array [
"1234",
"The data stored locally",
]
Outside the method: Array [
"1234",
"The data stored locally",
]
据我了解,承诺已被退回,我需要以某种方式处理该承诺,以等待其解决,然后再使用它。
麻烦是,我只是不知道如何。我在网上看到有人提到诸如Promise.resolve()之类的东西,然后使用.then()方法,但是我尝试的一切似乎都没有用。
有什么建议吗?谢谢
答案 0 :(得分:1)
您不应使用回调参数。这是因为当您不使用promise返回值时,这只会使编码人员的工作更加困难。相反,请忽略这些回调参数,并依赖返回的Promise:
export const loadLocalData = async () => {
var itemsStoredLocally = [];
// Use await:
const keys = await AsyncStorage.getAllKeys();
const stores = await AsyncStorage.multiGet(keys);
// Use forEach, not map: map is to return a mapped array
stores.forEach(result => {
let [key, value] = result;
// Do something with key/value?
// ...
console.log("Inside the method : ", result)
});
return stores; // Just return the result
}
该函数返回一个Promise,因此您需要等待它,例如使用then
:
loadLocalData.then(data => console.log("Outside the method: ", data));
请注意,只有在该函数中使用async
时,才使用await
。因此,您的代码中已经有一个危险信号...
答案 1 :(得分:0)
尝试这种方式
export const loadLocalData = async () => {
var itemsStoredLocally = [];
AsyncStorage.getAllKeys((err, keys) => {
AsyncStorage.multiGet(keys, (err, stores) => {
stores.map((result, i, store) => {
let key = store[i][0];
let value = store[i][1];
console.log("Inside the method : ", result)
itemsStoredLocally.push(result);
});
console.log("Outside the method: ", itemsStoredLocally);
return itemsStoredLocally;
});
})
}