我正在尝试从我的 AsyncStorage 数据库中获取所有密钥,然后在另一个函数中过滤它们,似乎无法让它等到 AsyncStorage 返回数据?
此函数返回数组中的键:
DATABASE_getAllCoffeeEntries = () => {
AsyncStorage.getAllKeys((err, keys) => {})
.then(keys => {
AsyncStorage.multiGet(keys, (error, items) => {
return items;
}).then(items => {
return items; // array of items is returned
});
});
}
这个函数旨在调用上面的函数,然后等待结果然后过滤数据。
somefunc = async () => {
var items = await DATABASE_getAllCoffeeEntries();
var someItems = items.filter(function (result, i, item) {
// do filtering stuff
return item;
});
// do something with filtered items
}
在这里尝试了很多,但无法理解它......任何帮助都会很棒,谢谢。
您需要从DATABASE_getAllCoffeeEntries
中返回一些内容
你可以做这样的事情。
- 首先,我们将您的电话包装在一个承诺中。如果我们从
AsyncStorage
或reject
那里获得所有项目,如果出现问题,这将resolve
。 - 确保我们对
AsyncStorage
的调用在try/catch
内。await
调用可能会引发,因此我们需要确保处理任何错误。 - 从
AsyncStorage
获取项目时使用async/await
,因为这会占用捕获来自AsyncStorage
响应的callbacks
。它还可以使你的代码更易于阅读
这是重构
DATABASE_getAllCoffeeEntries = () => {
return new Promise( async (resolve, reject) => {
try {
let keys = await AsyncStorage.getAllKeys();
let items = await AsyncStorage.multiGet(keys)
resolve(items)
} catch (error) {
reject(new Error('Error getting items from AsyncStorage: ' + error.message))
}
});
}
然后我们可以像这样调用函数,尽管我们必须将其包装在可以抛出的try/catch
中。
somefunc = async () => {
try {
var items = await this.DATABASE_getAllCoffeeEntries();
var someItems = items.filter(function (result, i, item) {
// do filtering stuff
return item;
});
// do something with filtered items
} catch (error) {
// do something with your error
}
}