Jam*_*nes 5 javascript promise
如果我正确理解 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);
});
Run Code Online (Sandbox Code Playgroud)
相反,前两个 Promise 得到解决,然后最后一个 Promise 被拒绝。此外,前两个 Promise 甚至没有按照它们传递给 Promise.all() 的顺序解析。我是否需要以不同的方式编写我的承诺才能看到我期望的行为?
已编辑
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);
});
Run Code Online (Sandbox Code Playgroud)
五秒后我只看到“内部服务器错误”。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);
});
Run Code Online (Sandbox Code Playgroud)
五秒后,此代码将输出:
{ 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!
Run Code Online (Sandbox Code Playgroud)
正是我们想要的。
Promise.all 不会对 Promise 强加任何顺序,它们会在履行时履行
第三个承诺在其他两个“解决”之后“拒绝”,因此前两个承诺在最后一个被拒绝之前得到解决是可以预料的
顺便说一句,你的前两个承诺正在解析值undefined并输出到控制台 - 这就是为什么你可能认为 Promise.all 正在做一些不应该做的事情
我是否需要以不同的方式编写我的承诺才能看到我期望的行为?
你不会得到你所期望的行为,因为你期望承诺以特定的顺序解决,唯一可能发生的方法是承诺等待前一个承诺完成才能实现,所以时间会是累积的,而不是并行的,所以在这种情况下,您不会在 7.5 秒内收到拒绝,而不是您“期望”的 5 秒