如果我正确理解 Promise.all(),我希望这段代码在输出之前需要 5 秒only拒绝对控制台的承诺的原因。
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);
});
相反,前两个承诺解决了,then最后的承诺被拒绝。此外,前两个 Promise 甚至没有按照它们传递给 Promise.all() 的顺序解析。我是否需要以不同的方式编写我的承诺才能看到我期望的行为?
Edited
Promise.all() 确实会等到传递给它的可迭代对象中的所有 Promise 都解析。我的第一个线索是控制台输出未定义(感谢 Jaromanda X)。如果我在解析 firstAsyncFunction() 和 secondaryAsyncFunction() 时删除对 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!
正是我们想要的。