reactjs - AsyncStorage 在 mergeItem 期间抱怨数组和对象不兼容
问题描述
我试图弄清楚为什么AsyncStorage
在 React Native 应用程序中拒绝mergeItem
处理我的数据。我的功能如下所示:
const arrToObj = (array) =>
array.reduce((obj, item) => {
obj[Object.keys(item)[0]] = Object.values(item)[0]
return obj
}, {})
export const addThingToThing = async (title, thing) => {
try {
let subThings = []
let things = {}
await AsyncStorage.getItem(THINGS_STORAGE_KEY)
.then((things) => {
let subThings = []
Object.values(JSON.parse(decks))
.map((thing) => {
if (Object.keys(thing)[0] === title) {
subThings = [...Object.values(thing)[0].subThings, subThing]
}
})
return { decks, subThings }
})
.then(({ decks, subThings }) => {
const obj = {
...arrToObj(JSON.parse(things)),
[title]: {
subThings
}
}
console.log(JSON.stringify(obj))
AsyncStorage.mergeItem(THINGS_STORAGE_KEY,
JSON.stringify(obj))
})
} catch (error) {
console.log(`Error adding thing to thing: ${error.message}`)
}
}
当我执行执行此操作时,我得到:
13:35:52: {"test":{"subThings":[{"one":"a","two":"a"}]},"test2":{"title":"test2","questions":[]}}
13:35:55: [Unhandled promise rejection: Error: Value [{"test":{"title":"test","subThings":[]}},{"test2":{"title":"test2","subThings":[]}}] of type org.json.JSONArray cannot be converted to JSONObject]
这令人困惑,因为当数据被打印出来时,它是一个带有 的对象{...}
,但AsyncStorage
显示的是一个带有 的数组[...]
。有什么我想念的吗?这对我来说似乎很愚蠢,我似乎无法弄清楚如何让 RN 发挥得很好。
PS。IMO 数据的结构很糟糕,但这是我正在使用的。我没有决定,也无法改变。
解决方案
我记得使用,它与返回 PromisesAsyncStorage
有根本的不同。localStorage
您的代码看起来很好,这使得这超级混乱,但我突然怀疑问题可能是由于缺少await
关键字。
尝试:
.then(async ({ decks, subThings }) => {
const obj = {
...arrToObj(JSON.parse(things)),
[title]: {
subThings
}
}
console.log(JSON.stringify(obj))
// We are adding await here
await AsyncStorage.mergeItem(THINGS_STORAGE_KEY, JSON.stringify(obj))
})
在继续之前,这可能是一个经典的“不等待 Promise 解决”,异步问题。如果是这样,请不要删除此问题。将来可能对包括我自己在内的其他人都有帮助。
这是我认为正在发生的事情:
JavaScript
AsyncStorage.mergeItem()
扔进函数队列这个函数没有
await
返回 Promise解释器不等待它解析并立即移动到下一行代码
没有下一行代码,因此它会在
then()
0.1 毫秒后从块中返回(请记住,它隐含地在return undefined
异步函数内部执行与 相同的操作resolve(undefined)
,关键是它正在尝试解析整个链备份到await AsyncStorage.getItem(THINGS_STORAGE_KEY)
obj
之后 0.1 毫秒收集垃圾AsyncStorage.mergeItem()
在预期的地方观察到一个虚假的值obj
,但我实际上并不确定。它可能没有执行第 5 步或第 6 步,而是mergeItem
在尝试解析getItem
链时检测到仍处于未决状态,无论哪种方式:AsyncStorage 然后给出一个令人困惑的错误消息
推荐阅读
- javascript - 如何让我的按钮停止发送错误 [INTERACTION_ALREADY_REPLIED]?
- python - MongoDB 插入 API 内容结果
- python - ValueError:数据基数不明确:x 大小:2 y 大小:455 确保所有数组包含相同数量的样本
- git - 在 git repo 中使用自己的 git 添加多个应用程序
- azure - 我无法在 Azure 中运行自定义扩展脚本
- python - 对具有不一致键的字典列表进行排序
- c++ - 将标签与默认值匹配不符合我的预期
- python - Catboost 的 Optuna 以随机顺序输出“试验”?
- python - 获取 __repr__ 以返回传递给 eval 时具有相同值的字符串?
- python - 尝试使用 django 模型创建队列(对于其他模型的实例)