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