繁体   English   中英

Json object model 未更新

[英]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而不是forEachasync function 来生成一组 Promise。

然后只需使用Promise.all等待它们全部完成。

请注意,此处的modifyJsonasyncTransalateText本身不需要标记为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM