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

Posted

技术标签:

【中文标题】React Native - 返回 AsyncStorage 中的所有 JSON 数据?【英文标题】:React Native - Return all JSON data in AsyncStorage? 【发布时间】:2018-06-20 00:57:46 【问题描述】:

在我的 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 req)会返回:

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

【问题讨论】:

【参考方案1】:

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

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);
  
;

这将返回一个对象,其中包含您拥有的所有键及其各自的值。

【讨论】:

【参考方案2】:

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

import  AsyncStorage  from 'react-native';

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

干杯!

【讨论】:

【参考方案3】:

要获取所有 AsyncStorage 密钥,您需要调用 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)
  

【讨论】:

所以在这种情况下似乎没有使用 id,我需要在将它传递给 importData() 之前在某处定义它吗? 这里的key是id,你可以使用普通的getItem,因为keys只是一个id数组并以这种方式连接它们。 感谢您的帮助。目前,我在解析后无法在控制台中显示内容。即在您的示例中,如果我使用 console.log(req),则不会显示任何内容,甚至不会显示通用对象响应,控制台为空白。这不是在解析后查看这些对象的正确方法吗? 你能检查一下钥匙里有什么吗?也许还没有任何设置。 为什么要混合 async / await 与 then 和回调?为什么不像@georgekpc 的回答那样一路走好?【参考方案4】:

返回 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')
    

【讨论】:

【参考方案5】:

这是使用 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")
    

【讨论】:

以上是关于React Native - 返回 AsyncStorage 中的所有 JSON 数据?的主要内容,如果未能解决你的问题,请参考以下文章

使用 react-navigation 禁用返回 react-native

react-native 返回并刷新

react-native-contacts getAll 返回 null

React-Native:按下 android 硬件后退按钮返回

react native自定义的导航栏怎么右滑返回

如何使用 react-native 从外部函数返回组件