【问题标题】:React Native AsyncStorage: using await and asyncReact Native AsyncStorage:使用等待和异步
【发布时间】:2019-07-02 08:36:33
【问题描述】:

我正在尝试从我的 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 
}

在这里尝试了很多,但我无法理解...任何帮助都会很棒,谢谢。

【问题讨论】:

  • getAllCoffeeEntries 应该是使用 await 关键字调用的异步函数,

标签: react-native asynchronous async-await asyncstorage


【解决方案1】:

你实际上需要从你的DATABASE_getAllCoffeeEntries返回一些东西

你可以做这样的事情。

  1. 首先,我们将您的调用封装在一个 Promise 中。如果我们从AsyncStoragereject 获取所有项目,则将resolve 出现问题。
  2. 确保我们对AsyncStorage 的调用位于try/catch 内。 await 调用可能会抛出,因此我们需要确保处理任何错误。
  3. 在从AsyncStorage 获取项目时使用async/await,因为这可以避免callbacks 捕获来自AsyncStorage 的响应。它还可以使您的代码更易于阅读

这里是重构

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
  }
}

【讨论】:

  • 这就是我在堆栈上提问的原因,谢谢!这真的很有帮助,我喜欢你调用 AsyncStorage DB 的简洁方式,很容易阅读!再次感谢!
  • 很高兴它对您有所帮助。 promisesasync/await 可能很棘手。这是一篇不错的文章medium.com/@bluepnume/…
  • 感谢您的链接!会好好研究的!上面的代码完美运行!一旦this. 被添加到somefunc() 调用的DB 函数中(是我的错误)
  • 是的,我也错过了。我刚刚复制了您的代码并添加了try/catch。我现在已经在我的答案中修复了它
猜你喜欢
  • 2019-03-21
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
  • 2021-03-26
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多