使用promises时为什么最后一次调用?

时间:2016-04-16 13:46:02

标签: javascript node.js

我在Promises上看this video(约36分钟的代码),但我对一些代码感到困惑:

getUser('mjackson')
.then(getTweets)
.then(updateStatus)
.then(undefined, handleError);

我理解这个问题是为什么最后一个then被调用?为什么它会将undefined作为第一个参数传递?

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

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

我希望这是有道理的。

3 个答案:

答案 0 :(得分:5)

任何带有作为第二个参数提供的函数的 GregorianCalendar date = new GregorianCalendar(); while( date.get( Calendar.DAY_OF_WEEK ) != Calendar.MONDAY ) date.add( Calendar.DATE, 1 ); } alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, date.getTimeInMillis(), 7 * 24 * 60 * 60 * 1000, pendingintentResetAlarms); 将捕获并处理承诺链中更远的任何被拒绝的承诺。

因此,如果thengetUsergetTweets失败,错误将在updateStatus处理。

此代码将handleError作为第一个参数传递,因为在这种情况下undefined是写作者想要做的最后一件事,如果成功则没有其他事情要做。

大多数承诺库和ES6承诺标准提供的updateStatus方法实际上只是.catch(...)的简写:

.then(undefined, ...)

答案 1 :(得分:2)

使用promise方法有两种方法,用于异步流控制,尤其是错误处理。

第一个是:

anOperation.then(onsuccess, onerror);

第二个是:

anOperation.catch(onerror);

如果onsuccess未定义或在第一种情况下为null,则意味着那里没有成功选项(因此在成功案例之后它会转移到成功)。

您看到/使用的大多数承诺都是.then(onsuccess, undefined)

应该注意:

  • 如果您在onsuccess中抛出错误,onerror 会被解雇。它会向下移动到下一个错误。在同一个.then中触发两个回调是不可能的,这是一个或两个场景

  • 如果您从.catchonerror回调中返回值,则预计您已解决了该问题,因此,您将进入下一个onsuccess下一个.then的值,包含您返回的值。如果这不是您想要的,请重新抛出或返回Promise.reject

答案 2 :(得分:2)

then功能的签名是:

p.then(onFulfilled, onRejected);

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

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

如果then函数返回promises,则可以创建then链。 handleError已经打过电话,因为链中的一个先前的承诺失败了。

带有示例的链中的承诺

Here my JsBin to understand a promise chain。尝试更改doX或catchX函数中的giveMeSuccessPromisegiveMeFailPromise函数。

then条款链中,如下所示:

p.then(doFirst)
   .then(doSecond)
   .then(doThird)
   .then(undefined, catchFirstSecondThird)
   .then(doFourth)
   .then(doFifth, catchEveryThing);

在此示例中,如果任何 doFirst,doSecond或doThird 失败 catchFirstSecondThird 将被执行。如果 catchFirstSecondThird,doFourth或doFifth 失败 catchEveryThing 将被执行。

快乐路径中的执行顺序:

  

doFirst,doSecond,doThird,doFourth,doFifth

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

  

doFirst,catchFirstSecondThird,doFourth,doFifth

仅在doSecond失败时执行的顺序:

  

doFirst,doSecond,catchFirstSecondThird,doFourth,doFifth

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

  

doFirst,catchFirstSecondThird,doFourth,catchEveryThing

资源: