2 回答

TA貢獻2036條經驗 獲得超8個贊
如果使用 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);
})();

TA貢獻1864條經驗 獲得超2個贊
modifyJson應該返回一個承諾才能被await編輯。
由于async隱式標記的函數會返回承諾,因此您可以使用與函數Array.map相反的方式來生成承諾數組。forEachasync
然后只需使用Promise.all等待所有這些完成。
請注意,此處的modifyJson和asyncTransalateText本身不需要標記為async。通常,函數不應標記為asyncAND 返回承諾。
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);
})();
添加回答
舉報