我有两个承诺,一个拒绝,另一个解决 . Promise.all被调用 . 它执行Promise.all的catch块,因为其中一个承诺被拒绝 .
const promise1 = Promise.resolve('Promise 1 Resolved');
const promise2 = Promise.reject('Promise 2 Rejected');
const promise3 = Promise.all([promise1, promise2])
.then(data => {
console.log('Promise.all Resolved', data);
})
.catch(error => {
console.log('Promise.all REJECTED', error);
})
setTimeout(() => {
console.log(promise1, promise2, promise3)
}, 200);
如果我没有Promise.all()上的catch,则值仍为Rejected,即
const promise3 = Promise.all([promise1, promise2])
.then(data => {
console.log('Promise.all Resolved', data);
})
我错过了一些关于承诺的事情 .
2 回答
我看到它的答案,但我想我可以澄清一点 .
请记住每个
then()
或catch()
都返回一个Promise
. (如果回调中没有任何明确的return
,则两者都将返回Promise.resolve(undefined)
) . 因此,在promise解决之后,整个promise链的值将是lastthen()
返回的promise . 例:catch()
的工作原理与then()
完全相同 . 唯一的区别是它呼吁rejected
承诺而不是resolved
. 在下面的示例中,我只是将所有resolve
替换为reject
来演示 .现在回答你的问题 .
Promise.all()
的值是被拒绝的承诺,因为数组中的一个承诺被拒绝 . 如果链中有一个catch块,则控制将转到catch
块,该块将返回Promise.resolve(undefined)
. 如果链条中没有阻塞块,您将获得所拥有的东西:被拒绝的承诺 .Promise上的
catch
与try {} catch {}
块的作用相同,因为您已捕获错误状态,程序将继续正常运行 .这就是为什么,当你省略
catch
时,你的承诺状态是"rejected"
.如果在捕获错误后,您希望将promise状态返回为已拒绝,则需要从catch处理程序返回被拒绝的promise:
与在
try {} catch { throw; }
块中执行throw
类似