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);
}
};
在我的 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);
}
};