我有两个承诺,一个被拒绝,另一个已解决。 Promise.all被称为。它执行了Promise.natch的catch块,因为其中一个promise被拒绝了。
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()没有把握,则该值将保持为Rejected,即
const promise3 = Promise.all([promise1, promise2])
.then(data => {
console.log('Promise.all Resolved', data);
})
我错过了一些关于诺言的事情。
答案 0 :(得分:4)
我看到了它的答案,但我想我可以澄清更多。
请记住,每个then()
或catch()
都返回一个Promise
。 (如果回调中没有任何显式的return
,则两者都将返回Promise.resolve(undefined)
)。因此,在诺言解决之后,整个诺言链的价值就是最后一个then()
返回的诺言;
示例:
promise = Promise.resolve(1)
.then(() => Promise.resolve(2))
.then(() => Promise.resolve(3));
console.log(promise);
setTimeout(() => {
console.log(promise)//Promise {<resolved>: 3}
}, 0)
catch()
的工作原理与then()
类似。唯一的区别是,它在rejected
上的承诺而不是resolved
。
在下面的示例中,我只是将所有resolve
替换为reject
来进行演示。
promise = Promise.reject(1)
.catch(() => Promise.reject(2))
.catch(() => Promise.reject(3));
console.log(promise);
setTimeout(() => {
console.log(promise)//Promise {<rejectd>: 3}
}, 0)
现在问您的问题。 Promise.all()
的值是被拒绝的承诺,因为数组中的一个承诺被拒绝了。如果链中有一个catch块,则控制将转到该catch
块,该块将返回一个Promise.resolve(undefined)
。如果您的链条中没有捕获块,您将获得所拥有的:被拒绝的诺言。
答案 1 :(得分:2)
Promise上的catch
的作用与try {} catch {}
块相同,因为您已捕获了错误状态,程序将继续正常运行。
这就是为什么当您省略catch
时,您的承诺状态为"rejected"
。
如果在捕获到错误之后,您想将promise状态返回为已拒绝,则需要从catch处理程序返回被拒绝的promise:
const promise3 = Promise.all([promise1, promise2])
.catch(error => {
console.log("REJECTED", error);
return Promise.reject(error);
});
console.log(promise3); // [[PromiseStatus]]: "rejected"
类似于在throw
块内执行try {} catch { throw; }