使用抛出JavaScript的结果链接承诺

使用抛出JavaScript的结果链接承诺,javascript,promise,Javascript,Promise,我真的不明白这个承诺在这里是怎么起作用的: Promise.resolve(1) .然后(x=>x+1) .然后(x=>{throw x}) .then(x=>console.log(x)) .catch(err=>console.log(err))//2 .然后(x=>Promise.resolve(1)) .catch(err=>console.log(err)) 。然后(x=>console.log(x))//1发生了以下事情: Promise.resolve(1)创建一个值为1的承诺

我真的不明白这个承诺在这里是怎么起作用的:

Promise.resolve(1)
.然后(x=>x+1)
.然后(x=>{throw x})
.then(x=>console.log(x))
.catch(err=>console.log(err))//2
.然后(x=>Promise.resolve(1))
.catch(err=>console.log(err))

。然后(x=>console.log(x))//1
发生了以下事情:

  • Promise.resolve(1)
    创建一个值为
    1
    的承诺
  • .then(x=>x+1)
    向该承诺添加履行处理程序,创建新承诺(
    .then
    .catch
    。最后
    始终创建承诺)。调用履行处理程序时,它将把调用它的承诺的履行值作为
    x
    ,添加
    1
    ,并使用该值履行其承诺
  • 。然后(x=>{throw x})
    从步骤2向承诺添加一个实现处理程序,创建一个新的承诺。调用时,履行处理程序将获取它附加到的承诺的履行值(
    1+1
    is
    2
    ),并使用该值来抛出一个值。这拒绝了第二次创建的承诺
  • .catch(err=>console.log(err))
    向该承诺添加拒绝处理程序。调用拒绝处理程序时,它将拒绝原因(我们知道将是
    2
    )作为
    err
    ,并记录它。由于拒绝处理程序不会抛出错误或返回已被拒绝或将被拒绝的承诺,因此它会将拒绝转换为履行。在本例中,它使用
    console.log
    的返回值来实现其承诺。该值未定义
  • …然后同样的模式再次重复

    关键位有:

    • 。然后
      。捕获
      。最后
      创建承诺
    • 如果您从实现或拒绝处理程序返回值(显式或隐式),并且该值不是被拒绝或将被拒绝的承诺,则它将实现使用该值创建的承诺
    • 如果您在
      处理程序中抛出(或返回已拒绝或将拒绝的承诺)。然后
      .catch
      处理程序将拒绝承诺
      。然后
      catch
      创建


    如果您不完全清楚承诺的术语(“履行”、“拒绝”、“解决”[我在上面没有使用,但代码使用了]),我;-)

    请更具体地说明您试图实现的目标。FWIW,我将在我的新书《JavaScript:新玩具》第8章中详细介绍承诺。如果您感兴趣,请在我的个人资料中添加链接。那么,为什么它在捕获后不停止?@Aygul-请参阅上文第4节。
    catch
    处理程序不会抛出错误或返回被拒绝(或将被拒绝)的承诺,因此它会将拒绝转化为履行(就像
    try
    /
    catch
    上的
    catch
    会抛出错误或返回承诺)。@Aygul您自己编写了它:“否则,问题就解决了”。你为什么期望它“停止”?你的意思是它永远不会解决任何问题吗?