React Native - Return AsyncStorage 中的所有 JSON 数据?

React Native - Return all JSON data in AsyncStorage?

在我的 React Native 应用程序的 AsyncStorage 中,我有多个 JSON 对象,每个对象都有一个唯一的密钥 ID,如下所示:

 '62834456':
 data: { "foo": "bar",
 "nicknames": [ "grizz", "example" ],
 ... and so on }

它们已被推入 AsyncStorage 字符串化。我试图通过它们的 id 检索每个对象,并将 id 和它的 JSON 数据推送到组件的状态中。到目前为止我有这个:

// for every key in async storage, push to favorites in state
importData = (id) => {
  for (id in AsyncStorage) {
    return AsyncStorage.getItem(id)
      .then(req => JSON.parse(req))
      .then(json => console.log(json))
      .catch(error => console.log('error!'));
  }
}

当上述函数中console.logging 'json'时,结果为null。如何正确访问 AsyncStorage 中的所有 JSON 对象?

最终编辑

使用您的代码示例并删除 JSON.parse(如此简单 console.logging 请求)returns:

发生这种情况似乎是因为出于某种原因 .forEach 返回数组中的第一个字符串,数组本身,然后是第二个字符串。

为了得到所有的AsyncStorage keys,你需要调用AsyncStorage.getAllKeys()。为了加快速度,您还应该使用 AsyncStorage.multiGet() 这样您的代码就变成了;

importData = async () => {
  try {
    const keys = await AsyncStorage.getAllKeys();
    const result = await AsyncStorage.multiGet(keys);

    return result.map(req => JSON.parse(req)).forEach(console.log);
  } catch (error) {
    console.error(error)
  }
}

这是使用 async/await 函数

获取所有项目的更优雅的方法
const fetchAllItems = async () => {
    try {
        const keys = await AsyncStorage.getAllKeys()
        const items = await AsyncStorage.multiGet(keys)

        return items
    } catch (error) {
        console.log(error, "problemo")
    }
}

return json 对象的代码

    try {
        const keys = await AsyncStorage.getAllKeys()
        const itemsArray = await AsyncStorage.multiGet(keys)
        let object = {}
        itemsArray.map(item => {
          object[`${item[0]}`] = item[1]
        })
        return object
    }   catch (error) {
        console.log(error, 'error')
    }

可能是,使用 promises 有点直截了当。

import { AsyncStorage } from 'react-native';

  AsyncStorage.getAllKeys()
    .then((keys)=> AsyncStorage.multiGet(keys)
                    .then((data) => console.log(data)));

干杯!

我不喜欢当前答案的一点是,它 return 返回一个数组数组,这将使搜索特定键变得更加困难。这是我喜欢使用的:

const getAll = async () => {
  try {
    const result: any = {};
    const keys = await AsyncStorage.getAllKeys();
    for (const key of keys) {
      const val = await AsyncStorage.getItem(key);
      result[key] = val;
    }
    return result;
  } catch (error) {
    alert(error);
  }
};

这将 return 使用您拥有的所有键及其各自的值返回一个对象。

通过使用 Object.fromEntries (doc)

const getAllData = async() => {
  try {
    const keys = await AsyncStorage.getAllKeys();
    const result = await AsyncStorage.multiGet(keys);
    const obj = Object.fromEntries(result);
    // obj be like {"key1": "value 1", "key2": "value 2", .....}
    // Now parse the 
    Object.keys(obj).forEach(key => {
      obj[key] = JSON.parse(obj[key]);
    });
  } catch (error) {
    console.error(error);
  }
};