我在Promises上看this video(约36分钟的代码),但我对一些代码感到困惑:
getUser('mjackson')
.then(getTweets)
.then(updateStatus)
.then(undefined, handleError);
我理解这个问题是为什么最后一个then
被调用?为什么它会将undefined
作为第一个参数传递?
如果getTweets()
失败,则永远不会调用updateStatus()
。这就是为什么我很困惑为什么如果第二个(包含then
的那个)没有调用最后一个updateStatus()
。
我知道handleError
是一个回调,我只是不明白为什么undefined
被传递。
我希望这是有道理的。
答案 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);
将捕获并处理承诺链中更远的任何被拒绝的承诺。
因此,如果then
或getUser
或getTweets
失败,错误将在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
中触发两个回调是不可能的,这是一个或两个场景
如果您从.catch
或onerror
回调中返回值,则预计您已解决了该问题,因此,您将进入下一个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函数中的giveMeSuccessPromise
和giveMeFailPromise
函数。
在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
资源: