gpt4 book ai didi

javascript - 我可以在 Promise.all() 中间将新的 promise 插入数组吗?

转载 作者:行者123 更新时间:2023-11-30 13:49:29 25 4
gpt4 key购买 nike

我正在尝试了解 Promise.all 的工作原理。我的问题是:将 Promise.all() 中间的新 promise 推送到先前传递的同一数组中是否可以?例如,我有这段代码可以正常工作: https://jsfiddle.net/artheg/z0Lndw1o/14/

const promises = [];
const promise1 = new Promise(function(resolve, reject) {
resolve('promise1');
const promise2 = new Promise(function(resolve, reject) {
resolve('promise2');
});
pushPromise(promise2); // Pushing promise2 to the same array after the promise1 was resolved
});

pushPromise(promise1); // Pushing promise1

function pushPromise(promise) {
promises.push(promise);
}

Promise.all(promises).then(function(values) {
console.log(values); // Array [ "promise2", "promise1" ]
});

这种行为是有意为之,还是我应该始终将 promise 与 .then() 链接在一起,而不是将新的 Promise 插入数组?

最佳答案

promise 执行器中的代码(您传递 new Promise 的函数)同步 运行。所以 pushPromise(promise2) 在你调用 Promise.all 之前已经运行了。当您调用 Promise.all 时,数组已经填满。

Can I push new promise into array in the middle of Promise.all()?

如果您希望 Promise.all 看到该 promise ,则不是。参见 the specification , Promise.all 循环遍历您同步传递给它的可迭代对象,在返回之前,以及在可以调用它 (Promise.all) 上设置的任何处理程序之前。

这是一个示例,请注意来自 Promise.all 的 promise 被履行而不是拒绝,即使代码向它拒绝的数组添加了 promise :

const promises = [
Promise.resolve(1),
Promise.resolve(2).finally(() => {
promises.push(Promise.reject(new Error("failed")));
}),
Promise.resolve(3),
];
Promise.all(promises)
.then(results => {
console.log(`results (${results.length}): ${results.join(", ")}`);
console.log(`promises.length: ${promises.length}`);
})
.catch(error => {
console.error(error);
});

关于javascript - 我可以在 Promise.all() 中间将新的 promise 插入数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58571065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com