Javascript 当使用承诺时,为什么会调用最后一个呢?

Javascript 当使用承诺时,为什么会调用最后一个呢?,javascript,node.js,Javascript,Node.js,我正在看(大约36分钟的代码)的承诺,但我被一些代码弄糊涂了: getUser('mjackson') .then(getTweets) .then(updateStatus) .then(undefined, handleError); 我理解这一点的问题是,为什么最后一个会被调用?为什么它会将undefined作为第一个参数传递 如果getTweets()失败,则永远不会调用updateStatus()。这就是为什么我不明白为什么如果第二个(包含updateStatus())没有被调用,那

我正在看(大约36分钟的代码)的承诺,但我被一些代码弄糊涂了:

getUser('mjackson')
.then(getTweets)
.then(updateStatus)
.then(undefined, handleError);
我理解这一点的问题是,为什么最后一个
会被调用?为什么它会将
undefined
作为第一个参数传递

如果
getTweets()
失败,则永远不会调用
updateStatus()
。这就是为什么我不明白为什么如果第二个(包含
updateStatus()
)没有被调用,那么最后一个
就会被调用

我知道
handleError
是一个回调,我只是不明白为什么
undefined
会被传递


我希望这是有意义的。

任何
,然后作为第二个参数提供函数的
将捕获并处理承诺链上更远的任何被拒绝的承诺

因此,如果
getUser
getTweets
updateStatus
失败,错误将在
handleError
中处理

此代码将
undefined
作为第一个参数传递,因为在本例中,
updateStatus
是编写它的人最不想做的事情,如果成功了,就没有什么可做的了

大多数promise库和ES6 promise标准都提供了一个
.catch(…)
方法,它实际上只是
的简写。然后(未定义,…)


有两种方法可以使用promise方法,用于异步流控制,特别是用于错误处理

第一个是:

anOperation.then(onsuccess, onerror);
二是:

anOperation.catch(onerror);
如果在第一种情况下,
onsuccess
未定义或为null,则表示此处没有success选项(因此在成功情况下,它将移到该选项之后的success)

您看到/使用的大多数承诺都是
。然后(onsuccess,undefined)

应当指出:

  • 如果在成功时在
    onsuccess
    中抛出错误,
    onerror
    不会被触发。它向下移动到下一个错误。不可能在同一个
    中同时启动两个回调。然后
    ,这是一个非此即彼的场景

  • 如果您从
    .catch
    onerror
    回调返回值,则预期您已经解决了问题,因此,您进入下一个
    的下一个
    onsuccess
    。然后使用返回的值进入下一个
    。如果这不是您想要的,请重试或返回一个
    承诺。拒绝


然后
函数的签名是:

p.then(onFulfilled, onRejected);
如果将
undefined
作为第一个参数传递,则其行为类似于
p.catch(onRejected)

then
链中,每个成功函数都将按顺序调用,除非有一个函数失败。如果其中一个失败,则所有执行都将中断,除非存在另一个参数。第二个参数将表现为任何对象的捕获

如果
then
函数返回承诺,则可以创建
then
链。
handleError
已调用,因为链中以前的一个承诺失败

以一个例子在链条中做出承诺

。尝试更改doX或catchX函数中的
givemesuccespromise
giveMeFailPromise
函数

在一系列
中,然后
条款如下:

p.then(doFirst)
   .then(doSecond)
   .then(doThird)
   .then(undefined, catchFirstSecondThird)
   .then(doFourth)
   .then(doFifth, catchEveryThing);
在本例中,如果doFirst、doSecond或doThird失败,则将执行catchFirstSecondThird。如果catchFirstSecondThird、doFourth或doFifth中的任何一个未能捕获,则将执行所有操作

快乐路径中的执行顺序:

第一,第二,第三,第四,第五

只有doFirst失败时的执行顺序:

第一,第一,第二,第四,第五

仅doSecond失败时的执行顺序:

doFirst,doSecond,CatchFirstSecond,doFourth,doFifth

doFirst和doFourth失败时的执行顺序:

做第一,接住第一,接住第二,接住第四,接住一切

资源:


我认为这是因为他想处理被拒绝的承诺,但不想对已解决的承诺做任何事情。
p.then(doFirst)
   .then(doSecond)
   .then(doThird)
   .then(undefined, catchFirstSecondThird)
   .then(doFourth)
   .then(doFifth, catchEveryThing);