【问题标题】:When Promise state become rejected or resolved当 Promise 状态被拒绝或解决时
【发布时间】:2019-04-17 09:04:18
【问题描述】:

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
);

在上面的代码 sn-ps 中,即使我正在调用拒绝,但承诺状态正在解决,但是当我从 promise.then 中删除 error => alert(error) 时,我得到的承诺状态为已拒绝 如果有人打电话拒绝,那么承诺状态应该被拒绝而不是解决我正确吗?

【问题讨论】:

    标签: javascript ecmascript-6 promise es6-promise


    【解决方案1】:

    解决的promise不是原来的promise,而是then返回的promise。原来的promise确实被拒绝了,你可以通过console.log(promise)来验证。但是因为你链接了thenit returns another promise..

    返回值 [then]

    Promise 处于 待处理 状态。处理函数 (onFulfilledonRejected) 然后被 异步调用 (尽快 因为堆栈是空的)。调用处理函数后, 如果处理函数:

    • 返回一个值,then 返回的承诺通过 返回值作为它的值;
    • 不返回任何东西,then 返回的承诺得到resolved 并带有undefined
    • 抛出一个错误,然后返回的承诺被抛出的拒绝 error 作为它的值;

    ...

    第二点适用于您的情况。您可以通过观察来验证 Promise.reject().then(undefined, ()=>{})
    返回一个使用 undefined 值解决的承诺。

    【讨论】:

      【解决方案2】:

      您还可以像下面这样以“then-catch”方式处理 Promise

      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))

      【讨论】:

      • then 接受两个参数 - 一个用于成功回调,另一个用于拒绝回调。使用它是处理 Promise 拒绝的有效方法。
      • 一个promise应该有异常处理机制。这就是为什么我们有.catch,当从承诺主体抛出异常时,控制权转到.catch。如果您调用resolve,则控制转到.then 的第一个执行程序参数,如果您调用reject,则它转到.then 的第二个参数。所以我认为我们应该同时拥有thencatch
      【解决方案3】:

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

      如果您遇到任何意外行为,请确认您没有使用替换原始 Promise 对象的错误 polyfill。

      参考:Promise.prototype.thenPromise.prototype.catch

      【讨论】:

        【解决方案4】:

        在您的情况下,承诺的最终状态也被拒绝。 试试 console.log(promise); 它与错误无关 => alert(error)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-04-15
          • 2020-09-17
          • 2020-09-12
          • 2017-03-14
          • 1970-01-01
          • 1970-01-01
          • 2023-03-17
          相关资源
          最近更新 更多