调用 Promise.all() 时如何提供有关承诺的元数据?

How to supply metadata about the promises when calling Promise.all()?

我正在编写一些 Javascript 代码,如下所示:

const arrayOfPromises = getArrayOfPromises();
Promise.all(arrayOfPromises).then(array => doStuff(array));

我需要将 getArrayOfPromises() 更改为 return 关于每个承诺的一些信息 - 为简单起见,假设它是每个承诺的简单 true/false 标志。我的第一直觉是将此函数重构为 return 对象数组,例如:

const getArrayOfObjects = () => {
    ...
    return [
             { promise: promise1, flag: flag1 },
             { promise: promise2, flag: flag2 },
             ...
             { promise: promisen, flag: flagn }
           ];
}

但是,上面的代码不适用于 Promise.all,因为它只能直接使用 Promise 对象的可迭代对象,中间没有包装器对象。

为每个承诺提供此类元数据然后在所有承诺都已解决后使用它的最简单方法是什么?

What's the simplest way to supply such metadata for each of the promises and then work with it once all the promises have been resolved?

只需将数据放在每个结果值中即可。它不是关于承诺的元数据,而是关于价值 (?) 的元数据,并且在所有承诺都得到解决之前您不需要使用它,因此结果是完美的地方。这些标志只是成为 Promise.all(…) 解析为的 array 的内容。

如果您想在承诺已解决后使用此元数据,并且您无法控制由 return 从 getArrayOfPromises() 编辑的承诺所解决的值,然后你可以简单地在数组中的每个单独的承诺上调用 then() 并使它 return 与你的元数据相结合的原始值。不过请确保将原始承诺替换为由 .then() 编写的 return 承诺。 Array.prototype.map() 让这变得简单:

arrayOfPromises = arrayOfPromises.map(promise => promise.then(value => ({
  value,
  flag: true
})));

示例:

let arrayOfPromises = getArrayOfPromises();
arrayOfPromises = arrayOfPromises.map(promise => promise.then(value => ({
  value,
  flag: true
})));

Promise.all(arrayOfPromises).then(array => doStuff(array));

function getArrayOfPromises() {
  return [sleep(1000), sleep(1500), sleep(2000)];
}

function doStuff(array) {
  console.log(array);
}

function sleep(ms) {
  return new Promise(resolve => setTimeout(() => resolve('resolved after ' + ms), ms));
}

如果您 可以控制 getArrayOfPromises() return 的内容,那么只需 return 元数据作为值的一部分正在解决中。