gpt4 book ai didi

javascript - Promise.all() 未按预期顺序解决 promise

转载 作者:行者123 更新时间:2023-11-29 19:23:39 27 4
gpt4 key购买 nike

如果我对 Promise.all() 的理解正确,我预计此代码需要 5 秒的时间才能向控制台输出拒绝 promise 的原因。

function firstAsyncFunction() {
return new Promise(function(resolve, reject){
setTimeout(function(){
resolve(console.log('First async function has been resolved!'));
}, 500);
});
}

function secondAsyncFunction() {
return new Promise(function(resolve, reject) {
setTimeout(function(){
resolve(console.log('Second async function has been resolved!'));
}, 2000);
});
}

function thirdAsyncFunction() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
reject('Internal server error'); // rejected for some reason
}, 5000);
});
};

Promise.all([secondAsyncFunction(), firstAsyncFunction(), thirdAsyncFunction()])
.then(function(values){
values.forEach(function(value){
console.log(value);
});

}).catch(function(err){
console.log(err);
});

相反,前两个 promise 解决,然后最后一个 promise 拒绝。此外,前两个 promise 甚至没有按照它们传递给 Promise.all() 的顺序进行解析。我是否需要以不同的方式编写 promise 才能看到我期望的行为?

已编辑

Promise.all() 确实会等待传递给它的可迭代对象中的所有 promise 都解决。我的第一个线索是控制台正在输出未定义的信息(感谢 Jaromanda X)。如果我在对 firstAsyncFunction() 和 secondAsyncFunction() 的解析中删除对 console.log() 的调用,则以下代码片段将完全按照我的预期工作:

function firstAsyncFunction() {
return new Promise(function(resolve, reject){
setTimeout(function(){
resolve('First async function has been resolved!');
}, 1000);
});
}

function secondAsyncFunction() {
return new Promise(function(resolve, reject) {
resolve('Second async function has been resolved!');
});
}

function thirdAsyncFunction() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
reject('Internal server error');
}, 5000);
});
};

Promise.all([
thirdAsyncFunction(),
firstAsyncFunction(),
secondAsyncFunction()
])
.then(function(values){
values.forEach(function(value){
console.log(value);
});
})
.catch(function(err){
console.log(err);
});

五秒钟后,我只看到“内部服务器错误”。 Promise.all() 拒绝其他 promise ,即使它们比被拒绝的 promise 更早解决。是的,由 Promise.all() 解析的值将与作为参数传入的可迭代对象中的 promise 顺序相同。感谢您的帮助!

再举一个例子:

function firstAsyncFunction() {
return new Promise(function(resolve, reject){
setTimeout(function(){
resolve('First async function has been resolved!');
}, 1000);
});
}

function secondAsyncFunction() {
return new Promise(function(resolve, reject) {
resolve('Second async function has been resolved!');
});
}

function thirdAsyncFunction() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve({
users: [
{ name: 'Ronnie', age: 22 },
{ name: 'Bobby', age: 21 },
{ name: 'Ricky', age: 21 },
{ name: 'Mike', age: 20 }
]
});
}, 5000);
});
};

Promise.all([thirdAsyncFunction(), firstAsyncFunction(), secondAsyncFunction()])
.then(function(values){
values.forEach(function(value){
console.log(value);
});
})
.catch(function(err){
console.log(err);
});

五秒后,这段代码将输出:

{ users: 
[ { name: 'Ronnie', age: 22 },
{ name: 'Bobby', age: 21 },
{ name: 'Ricky', age: 21 },
{ name: 'Mike', age: 20 } ] }
First async function has been resolved!
Second async function has been resolved!

正是我们想要的。

最佳答案

Promise.all 不对 promise 施加任何顺序,它们在履行时履行

第三个 promise 在其他两个“resolve”之后“拒绝”,所以前两个在最后一个被 rejected 之前被 resolve 是可以预料的

顺便说一下,您的前两个 promise 是解析值 undefined 并输出到控制台 - 这就是为什么您可能认为 Promise.all 正在做它不应该做的事情

Do I need to compose my promises differently to see the behavior I'm expecting?

您不会完全得到您期望的行为,因为您希望 promise 以特定顺序解决,唯一可能发生的方式是 promise 等待前一个完成后才能履行,所以时间将是累积的,而不是平行的,所以在那种情况下,你不会在 7.5 秒内得到拒绝,而不是你“期望”的 5 秒

关于javascript - Promise.all() 未按预期顺序解决 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31893915/

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