代码之家  ›  专栏  ›  技术社区  ›  Sebin Benjamin

promise.all()的值在被拒绝后,显示[“promiseStatus”]:如果存在catch块,则解析

  •  5
  • Sebin Benjamin  · 技术社区  · 8 年前

    我有两个承诺,一个被拒绝,另一个得到了解决。答应我。一切都好。它履行了承诺的阻碍,所有的承诺都被拒绝了。

    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

    如果我没有catch on promise.all(),则该值将保持为已拒绝的值(即

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

    我错过了一些承诺。

    2 回复  |  直到 8 年前
        1
  •  4
  •   Sandeep Gupta    8 年前

    我看到了答案,但我想我可以再澄清一点。

    请记住 then() catch() 返回A Promise 是的。(如果你没有任何明确的 return 在回调中,两者都将返回 Promise.resolve(undefined) )中。因此,在承诺解决后,整个承诺链的价值将是最后一个返回的承诺 然后() (二) 例子:

    promise = Promise.resolve(1)
        .then(() => Promise.resolve(2))
        .then(() => Promise.resolve(3));
    console.log(promise);
    setTimeout(() => {
        console.log(promise)//Promise {<resolved>: 3}
    }, 0)
    

    捕获() 工作方式完全一样 然后() 是的。唯一的区别是 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 将返回 承诺。决心(未定义) 是的。如果你在这条链上没有绊脚石,你就会得到你所拥有的:一个被拒绝的承诺。

        2
  •  2
  •   CodingIntrigue    8 年前

    一个 catch 一个承诺和一个承诺一样 try {} catch {} 块,因为您已捕获错误状态,程序将继续正常运行。

    所以,当你忽略 抓住 ,你的承诺状态是 "rejected" 是的。

    如果在捕捉到错误后,您希望将promise状态返回为rejected,则需要从catch处理程序返回一个rejected 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; }

    推荐文章