首页 > 解决方案 > 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' } }

标签: javascriptnode.js

解决方案


modifyJson应该返回一个承诺才能被await编辑。

由于标记为async隐式返回承诺的函数,您可以使用Array.map而不是函数来生成forEachasync组承诺。

然后只需使用Promise.all等待所有这些都完成。

请注意,此处的modifyJsonandasyncTransalateText本身不需要标记为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);
})();


推荐阅读