我对 promises/Deferreds 有点陌生。对于成功和错误的情况,是否有一个好的模式来处理可能想要缩短 promise 链的情况?在错误情况下,我知道你可以将一个 .then(null, function(error) {})
链接到最后并从之前的任何一个 then 中捕获错误,但是如果你想以更自定义的方式处理错误并终止?您是否会在较早的错误处理程序中指定错误的“类型”并通过新的 promise 返回它,以在最终的错误处理程序中处理或跳过?如果您想在链中更早地终止(仅有条件地触发任何稍后的 then
)的成功案例呢?
最佳答案
通常,promise 链以调用某个异步函数开始:
var promise = callAsync();
如果你正在链接第二个异步调用,你可能会做这样的事情:
var promise = callAsync()
.then(function(){
return callOtherAsync();
})
.then(function(){
return callSuccessAsync();
}, function(){
return callFailAsync();
});
作为链接的结果,promise
现在包含在 callFinalAsync()
时完成的最终 promise 的 promise 完成。最后没办法短路promise
使用此模式时 - 您可以沿途返回失败的 promise (例如,而不是返回 callOtherAsync 的结果),但这需要失败的 promise 通过链(从而导致调用 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();
});
这取决于使用 this
访问中间 promise .一些 Promise 实现禁止这样做(强制 this
为 window/null/等),但您可以通过闭包来处理它。
TL;DR:Promise/A 规范不提供链短路功能,但添加一个并不难。
关于javascript - 有没有一种好的方法可以缩短 Javascript 的 promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20237921/