使用抛出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
is2
),并使用该值来抛出一个值。这拒绝了第二次创建的承诺.catch(err=>console.log(err))
向该承诺添加拒绝处理程序。调用拒绝处理程序时,它将拒绝原因(我们知道将是2
)作为err
,并记录它。由于拒绝处理程序不会抛出错误或返回已被拒绝或将被拒绝的承诺,因此它会将拒绝转换为履行。在本例中,它使用console.log
的返回值来实现其承诺。该值未定义
,。然后
和。捕获
创建承诺。最后
- 如果您从实现或拒绝处理程序返回值(显式或隐式),并且该值不是被拒绝或将被拒绝的承诺,则它将实现使用该值创建的承诺
- 如果您在
或处理程序中抛出(或返回已拒绝或将拒绝的承诺)。然后
处理程序将拒绝承诺.catch
或。然后
创建catch
如果您不完全清楚承诺的术语(“履行”、“拒绝”、“解决”[我在上面没有使用,但代码使用了]),我;-) 请更具体地说明您试图实现的目标。FWIW,我将在我的新书《JavaScript:新玩具》第8章中详细介绍承诺。如果您感兴趣,请在我的个人资料中添加链接。那么,为什么它在捕获后不停止?@Aygul-请参阅上文第4节。
catch
处理程序不会抛出错误或返回被拒绝(或将被拒绝)的承诺,因此它会将拒绝转化为履行(就像try
/catch
上的catch
会抛出错误或返回承诺)。@Aygul您自己编写了它:“否则,问题就解决了”。你为什么期望它“停止”?你的意思是它永远不会解决任何问题吗?