用另一个新的承诺拒绝承诺

时间:2020-04-03 10:44:28

标签: javascript ecmascript-6 promise es6-promise

我在兑现承诺,我想要一种在回调中拒绝承诺的方法。因此,这可以通过调用throw return或return Promise.reject();来完成。到现在为止还挺好。您还可以通过调用新的Promise.reject()来完成此操作。没有回报。

有人可以解释为什么这样做吗?

new Promise((res, rej) => {
  setTimeout(() => {
    res(200);
  }, 2000);
})
  .then(() => {
    console.log("ok1");
    new Promise.reject();
    // return Promise.reject(); 
  .then(() => {
    console.log("ok2");
  })
  .catch(() => {
    console.log("error");
  });

4 个答案:

答案 0 :(得分:2)

new Promise.reject()

您的代码引发异常。异常导致承诺被拒绝。

答案 1 :(得分:1)

由于Promise.reject不是构造函数,因此此代码可以正常工作:

new Promise((res, rej) => {
  setTimeout(() => {
    res(200);
  }, 2000);
})
  .then(() => {
    console.log('ok1')
    Promise.reject('error!')
})
  .then(() => {
    console.log("ok2");
  })
  .catch(() => {
    console.log("error");
  });

答案 2 :(得分:1)

New Promise.reject引发错误,因此代码跳至具有以下错误的catch部分:Promise.reject is not a constructor

new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('OK');
  }, 2000);
}).then((res) => {
    console.log(res);
    new Promise.reject(); 
    })
  .then((res) => {
    console.log(res);
  })
  .catch((err) => {
    console.log('error' ,err.message);
  });

答案 3 :(得分:1)

那是因为Promise.reject的内部运作。它基本上可以做到:

Promise.reject = function(err) {
  return new this((_, rej) => rej(err));
};

现在,如果您使用new进行调用,则this指的是一个新创建的对象,它不是构造函数。

 Promise.reject(); // this == Promise -> constructor
 new Promise.reject(); // this == {} -> not a constructor

因此,.then回调引发一个错误,并且该错误导致返回的Promise被拒绝。