[英]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.