反应原住民AsyncStorage:使用的await和异步

问题描述 投票:1回答:1

我想从我的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 
}

已经尝试了很多在这里,但不能让我的头周围...任何帮助将是巨大的,谢谢。

react-native asynchronous async-await asyncstorage
1个回答
1
投票

你需要真正从DATABASE_getAllCoffeeEntries返回的东西

你可以做这样的事情。

  1. 首先,我们换一个承诺里面你的电话。其中,如果我们得到resolveAsyncStorage所有的项目,如果有一个问题会reject
  2. 确保我们的呼叫AsyncStoragetry/catch内。 await调用可以抛出,所以我们需要确保我们处理任何错误。
  3. async/await获取项目时,因为这得到被捕获从AsyncStorage的响应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
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.