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);
})();
添加回答
举报