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

标签 javascript arrays object promise metadata

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

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

我需要更改 getArrayOfPromises() 以返回有关每个 promise 的一些信息 - 为了简单起见,我们假设每个 promise 都有一个简单的真/假标志。我的第一直觉是重构这个函数以返回一个对象数组,例如:

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

但是,上面的内容不适用于 Promise.all,因为它只能直接使用可迭代的 Promise 对象,而无需中间的包装对象。

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

最佳答案

如果您想在 promise 解决后使用此元数据,并且您无法控制从 getArrayOfPromises() 返回的 promise 解决的值,那么您可以简单地对数组中的每个单独的 Promise 调用 then() ,并使其返回与元数据相结合的原始值。但请确保将原始 promise 替换为 .then() 返回的 promise 。 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()返回的内容,那么只需将元数据作为正在解析的值的一部分返回即可。

关于javascript - 调用 Promise.all() 时如何提供有关 Promise 的元数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69280951/

相关文章:

Javascript多维数组错误

javascript - 如何使动态创建的按钮像常规按钮一样工作

php - 过滤对象数组以保留在平面白名单数组中找到的具有特定属性值的对象

javascript - for 循环中的 If-else 不起作用 - Javascript

javascript - 为什么我不能将 Symbol.hasInstance 分配给函数?

javascript - Angularjs 模型未在嵌套 ng-repeat 内更新

javascript - 用位置替换数组中的对象

javascript - 使用for循环javascript将数据存储在数组中

php - 如何在PHP中对数组和数据进行排序?

Java 通过对象引用比较两个属性