Promise.all()的值在被拒绝后显示[''PromiseStatus“]:如果存在catch块则解析

时间:2018-06-24 16:28:02

标签: javascript ecmascript-6 promise es6-promise

我有两个承诺,一个被拒绝,另一个已解决。 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);

enter image description here

如果我对Promise.all()没有把握,则该值将保持为Rejected,即

const promise3 = Promise.all([promise1, promise2])
  .then(data => {
    console.log('Promise.all Resolved', data);
  })

我错过了一些关于诺言的事情。

2 个答案:

答案 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; }