我想更新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' } }
答案 0 :(得分:2)
modifyJson
应该返回一个承诺以便await
被实现。
由于标记为async
的函数隐式地返回了Promise,因此您可以将Array.map
与forEach
相对应地与async
函数一起使用,以生成一个Promise数组。
然后只需使用Promise.all
等待它们全部完成。
请注意,此处modifyJson
和asyncTransalateText
本身不需要标记为async
。通常,不应将函数标记为async
并返回承诺。
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);
})();
答案 1 :(得分:2)
如果使用for .. of循环枚举对象键,则结果将与预期的一样。
最初的问题是,当我们记录输出时,modifyJson将不会执行。
var json = {
lang: "es",
country : "Spain",
city : {
cityname : "name"
}
};
async function asynctranslateText() {
return new Promise((resolve, reject) => {
resolve("OK");
});
}
async function modifyJson(en) {
for(let item of Object.keys(en)) {
if (typeof en[item] === 'object') {
await modifyJson(en[item]);
} else {
en[item] = await asynctranslateText();
}
}
}
(async () => {
await modifyJson(json);
console.log(json);
})();