通常,Promise链以对某个异步函数的调用开始,例如:
var promise = callAsync();
如果您正在链接第二个异步调用,您可能会像这样做:
var promise = callAsync()
.then(function(){
return callOtherAsync();
})
.then(function(){
return callSuccessAsync();
}, function(){
return callFailAsync();
});
由于链接操作,现在
promise
包含了最终的承诺,在
callFinalAsync()
的承诺完成时它也会完成。使用这种模式没有办法使最终的
promise
提前结束 - 您可以在一路上返回一个失败的承诺(例如,而不是返回callOtherAsync的结果),但这需要失败的承诺通过链条进展(从而导致调用callFailAsync)。
您始终可以从回调中履行或拒绝
promise
,如下所示。
var promise = callAsync()
.then(function(){
if(fail){
promise.reject();
//no way to halt progression
}else{
return callOtherAsync();
}
})
.then(function(){
return callSuccessAsync();
}, function(){
return callFailAsync();
});
然而,这并不能阻止对
callFailAsync()
的调用。一些Promise/A实现会为此暴露一个
stop
方法。使用stop,你可以这样做:
var promise = callAsync();
.then(function(){
if(fail){
this.stop();
promise.reject();
}else{
return callOtherAsync();
}
})
.then(function(){
return callSuccessAsync();
}, function(){
return callFailAsync();
});
这取决于是否能够访问中间的 Promise,使用 this
。一些 Promise 实现禁止访问(强制将 this
设为 window/null 等),但可以通过闭包来处理。
简而言之,Promise / A 规范没有提供链式短路函数,但添加一个并不难。
method.success(function(){}).error(function(){})
的意思是什么? - Moritz Roessler