使用promise作为数组或对象的一部分来解析Promise.all

时间:2018-03-11 01:59:51

标签: javascript promise

我正在尝试将一堆异步调用并行排队。但是,我排队的承诺有额外的数据,我希望与承诺值保持一致。

我的问题是:如何传递一个包含promise的对象或数组,并将promises解析为对象中的值?

例如,让我们生成一个正常的承诺数组:

async function asyncFunction(input) {
  return input * 10;
}

async function main() {
  var promises = [];
  for (let i = 0; i < 10; i++) {
    promises.push(asyncFunction(i));
  }

  var result = await Promise.all(promises);
  
  document.getElementById('output').innerText = JSON.stringify(result);
}

main();
<div id='output'></div>

这很好用。但是现在如果我们尝试将promise放入一个对象中,并使用一些元数据:

async function asyncFunction(input) {
  return input * 10;
}

async function main() {
  var promises = [];
  for (let i = 0; i < 10; i++) {
    promises.push({
      id: i,
      value: asyncFunction(i)
    });
  }

  var result = await Promise.all(promises);
  
  document.getElementById('output').innerText = JSON.stringify(result);
}

main();
<div id='output'></div>

value中的值是一个承诺,而不是已解决的值。

我的预期输出是:

[{"id":0,"value":0},{"id":1,"value":10},{"id":2,"value":20},...]

2 个答案:

答案 0 :(得分:1)

您可以推送解析为所需格式的承诺:

&#13;
&#13;
async function asyncFunction(input) {
  return input * 10;
}

async function main() {
  let promises = [];

  for (let i = 0; i < 10; i++) {
    promises.push(
      asyncFunction(i).then(value => ({
        id: i,
        value,
      }))
    );
  }

  let result = await Promise.all(promises);
  
  console.log(result);
}

main();
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您可以映射承诺数组并等待包含解析承诺的值键

    async function asyncFunction(input) {
      return input * 10;
    }

    async function main() {
      var promises = [];
      for (let i = 0; i < 10; i++) {
        promises.push({
          id: i,
          value: asyncFunction(i)
        });
      }

      var result = await Promise.all(promises.map(async (promise) => ({
        id: promise.id,
        value: await promise.value
      })));

      document.getElementById('output').innerText = JSON.stringify(result);
    }

    main();