Json对象模型未更新

时间:2019-09-26 08:21:40

标签: javascript node.js

我想更新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' } }

2 个答案:

答案 0 :(得分:2)

modifyJson应该返回一个承诺以便await被实现。

由于标记为async的函数隐式地返回了Promise,因此您可以将Array.mapforEach相对应地与async函数一起使用,以生成一个Promise数组。

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

请注意,此处modifyJsonasyncTransalateText本身不需要标记为async。通常,不应将函数标记为async并返回承诺。

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);
})();

答案 1 :(得分:2)

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