javascript - Json 对象模型未更新
问题描述
我想像下面的代码一样更新 json 对象模型值。但是当我更改值时,它似乎并没有更新模型。
我试过删除异步代码,这似乎有效。为什么异步代码不起作用?有人可以解释一下吗。谢谢
var json = {
lang: "es",
country : "Spain",
city : {
cityname : "name"
}
};
async function asynctranslateText() {
return new Promise((resolve, reject) => {
resolve("OK");
});
}
async function modifyJson(en) {
Object.keys(en).forEach(async function (item) {
if (typeof en[item] === 'object') {
await modifyJson(en[item]);
} else {
en[item] = await asynctranslateText();
}
});
}
(async () => {
await modifyJson(json);
console.log(json);
})();
Output
{ lang: 'es', country: 'Spain', city: { cityname: 'name' } }
Expected output:
{ lang: 'OK', country: 'OK', city: { cityname: 'OK' } }
解决方案
modifyJson
应该返回一个承诺才能被await
编辑。
由于标记为async
隐式返回承诺的函数,您可以使用Array.map
而不是函数来生成forEach
一async
组承诺。
然后只需使用Promise.all
等待所有这些都完成。
请注意,此处的modifyJson
andasyncTransalateText
本身不需要标记为async
. 通常不应将函数标记为async
AND 返回一个承诺。
var json = {
lang: "es",
country: "Spain",
city: {
cityname: "name"
}
};
function asynctranslateText() {
return new Promise((resolve, reject) => {
resolve("OK");
});
}
function modifyJson(en) {
return Promise.all(Object.keys(en).map(async function(item) {
if (typeof en[item] === 'object') {
await modifyJson(en[item]);
} else {
en[item] = await asynctranslateText();
}
}));
}
(async() => {
await modifyJson(json);
console.log(json);
})();
推荐阅读
- sql - 使用 PostgreSQL 选择 json 中的特定条目
- machine-learning - LightGBM中的num_leaves选择?
- javascript - 是否有可能 Async Await - Fluent builder 方法
- html - aria-hidden 是否需要一个值?
- vba - VBA 无法移动到目录中的下一个文件,而是选择名为“..”的文件
- google-chrome - 如何通过 Chrome DevTools 查看元素的 x 和 y 位置?
- angular - 从 Http 请求转换响应的问题
- android - Android Firestore 无法获取 FirestoreInstance
- java - 从数据库中获取值作为密钥对
- sql - 在列中找不到值