Json 对象模型未更新

我想像下面的代码一样更新 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' } }


慕田峪7331174
浏览 175回答 2
2回答

慕桂英3389331

如果使用 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); })();

慕斯王

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);})();
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript