为什么将对象写入JSON文件时,id字段的取值总是显示为一对空大括号?
问题原因
你的id函数返回的是Promise对象,你直接将它赋值给userNote的id属性时,并没有等待异步逻辑执行完成拿到最终的id数值。JSON.stringify序列化Promise类型时,由于Promise没有可枚举的自有属性,就会被转为空对象{},这就是你遇到的问题的本质。
解决方法
你需要等待id函数的异步逻辑执行完成,拿到返回的数值后,再构造userNote对象并序列化。可以通过async/await实现,修改你的按钮点击处理逻辑即可:
// 将按钮点击处理函数声明为async submitButton.addEventListener('click', async () => { // 等待异步获取id结果 const noteId = await id(); // 拿到id后再构造提交对象 let userNote = { noteName: noteNameInput.value, important: noteImportant.value, reminder: noteDateInput.value, noteMsg: noteMsgInput.value, creationDate: creationDate(), id: noteId } let data = JSON.stringify(userNote); // 后续提交数据的逻辑写在这里即可 })
优化建议
- 你的
id函数里的setTimeout完全是多余的,没有任何作用还额外增加了1秒的等待时间,可以直接删掉。 - 目前的错误处理逻辑形同虚设,请求失败时会抛出未捕获异常,建议补充异常捕获逻辑,优化后的
id函数参考:
async function id(){ try { const PORT = process.env.PORT || 3001; const req = await fetch(`http://localhost:${PORT}/api`); if(!req.ok) throw new Error('接口请求失败') const data = await req.json(); return data.notes.length; } catch(err) { console.error('获取id失败:', err) throw err } }
内容的提问来源于stack exchange,提问作者king60096009
相关产品推荐
相关产品推荐

