我正在编写一些如下所示的 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/