当Promise状态被拒绝或解决时



let promise = new Promise(function(resolve, reject) {
      setTimeout(() => reject(new Error("Whoops!")), 1000);
});
// reject runs the second function in .then
promise.then(
  result => alert(result), // doesn't run
  error => alert(error) // shows "Error: Whoops!" after 1 second
);

在上面的代码片段中,尽管我调用了reject,但promise状态已解析,但当我从promise.then中删除error => alert(error)时,我将promise状态设置为rejected如果有人叫拒绝,那么承诺状态应该被拒绝而不是解决,我是对的吗?

解析的promise不是原来的promise,而是then返回的promise。最初的承诺确实被拒绝了,您可以通过console.log(promise)进行验证。但因为你锁住了then,它会返回另一个承诺。。

返回值[then]

处于挂起状态的Promise。处理程序函数(onFulfilledonRejected(然后异步调用(尽快因为堆栈是空的(。在调用处理程序函数之后,如果处理程序函数:

  • 返回一个值,then返回的promise将通过返回值作为其值
  • 不返回任何内容,则then返回的promise将被解析为undefined
  • 抛出错误,然后返回的promise将被抛出的误差作为其值

。。。

第二点适用于您的案例。你可以通过观察Promise.reject().then(undefined, ()=>{})
返回用undefined值解析的promise。

您也可以像下面的一样以"then-catch"的方式处理Promises

let promise = new Promise(function(resolve, reject) {
  setTimeout(() => reject('Error'));
});
promise
  .then(result => console.log('Result ', result)) 
  .catch(error => console.log('This is Error message -', error))

在您的案例中,承诺的最终状态也被拒绝。试试console.log(promise(;它与错误无关=>警报(错误(

您发布的代码似乎在Chrome和Firefox上都能正常工作——Promise不出所料被拒绝了。reject函数将Promise标记为已拒绝-然后,您可以通过将回调函数传递到then的第二个参数中或使用catch方法来对拒绝做出反应。这两种方法都是正确的。

如果遇到任何意外行为,请验证是否使用了替换原始Promise对象的错误polyfill。

参考:Promise.prototype.then,Promise.prottype.catch

最新更新