很难理解 Promise 链

问题描述

(我想我学到了这个,就是 .then 返回一个 promise,即使它没有运行,我从来不知道这一点,谢谢)

如果这是一个愚蠢的问题,请原谅我,但我就是不明白,我已经用谷歌搜索了很多次,但那些文章只非常简要地讨论了 Promise,比如如何创建一个,如何解决,如何。然后和东西。

我对承诺链感到困惑。

这是我的代码

    let p = new Promise(function (resolve,reject){
    
    let value = 19;
    
    if(!value){
        resolve(value)
    } else {
        reject(value)
    }
})

p.then(x => {console.log(x*x); throw false})
    .then(null,x => console.log(x))
//19

代码打印 19,我不知道为什么?。

我确实知道每个 .then 都会返回一个承诺,但在这种情况下, p.then 甚至不应该运行,因为承诺尚未解决。现在在某种程度上,似乎没有运行,但如果是这样,为什么第二个 .then 运行了?

我们的第一个 .then 没有运行,它没有运行任何承诺,所以不应该显示任何内容

现在,除非第二个 .then 的工作方式与 p.then() 相同,我希望它不会,因为这只会造成更多混乱,我不明白为什么第二个 .then 会运行?。

如果我的问题或英语不好,我再次抱歉,但我真的对此很好奇。

解决方法

Promise 可以处于以下状态之一:

pending -> 初始状态,既未完成也未拒绝。

已完成 -> 操作已成功完成。

拒绝 -> 操作失败。

在您的代码示例中,promise 被拒绝(因为 if value 是一个真值条件)。 then 方法接受两个参数:

  p.then(onFulfilled[,onRejected]);

  p.then(value => {
     // fulfillment
  },reason => {
   // rejection
  });

因为 then 是可链接的,所以拒绝 get 会在第二个链接的 then 代码行上触发:

x => console.log(x)

因此,打印值 19。

,

.then 函数接受两个函数作为参数,一个在 Promise 解析时调用,一个在拒绝时调用。它返回一个新的 Promise,该 Promise 使用执行的函数返回(或抛出)的任何值来解决或拒绝。如果没有执行处理程序,Promise 将使用与调用 Promise .then 相同的值来解析或拒绝。

在您的示例中,第一个 .then 调用仅接收一个参数,并且由于 Promise 拒绝它不会被执行。因此它返回的 Promise 也将拒绝,因此将执行第二个参数。

 // some examples
 Promise.resolve()
   .then(called,notCalled);

 Promise.reject()
   .then(notCalled,called);

 Promise.resolve(1)
    .then(null,notCalled)
    .then(it => it + 1,notCalled)
    .then(called,notCalled);

 Promise.reject(1)
   .then(notCalled,null)
   .then(notCalled,it => it + 1)
   .then(called,notCalled);