[英]How to add multiple values in JSON object and get an updated json file
[英]Json object model is not updated
我想更新 json object model 值,如下面的代码。 但是当我更改值时,它似乎并没有更新 model。
我试过删除异步代码,这似乎有效。 为什么异步代码不起作用? 有人可以解释一下吗。 谢谢
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
应该返回一个 promise 以便await
编辑。
由于标记为async
的函数会隐式返回 Promise,因此您可以使用Array.map
而不是forEach
和async
function 来生成一组 Promise。
然后只需使用Promise.all
等待它们全部完成。
请注意,此处的modifyJson
和asyncTransalateText
本身不需要标记为async
。 通常不应将 function 标记为async
并返回 promise。
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); })();
如果您使用 for.. of 循环枚举 object 键,结果将如预期。
最初的问题是,当我们记录 output 时,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); })();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.