Deferred对象有两个主要的回调池,即doneCallbacks和failCallbacks.两个池都是"线性的":回调按照给定的顺序依次存储.
这种线性结构似乎违背了处理错误时必须考虑的"树状"结构.每一步,都有两种情况:失败和通过.
if(err) {
// stuff
if(err) {
// stuff
} else {
// stuff
}
else {
// stuff
if(err) {
// stuff
} else {
// stuff
}
}
Run Code Online (Sandbox Code Playgroud)
似乎由于Deferreds 的强加线性,它们不太适合于错误处理.我忽略了什么吗?
这有点罗嗦,但这是来自jQuery文档$.when():
在将多个Deferred对象传递给jQuery.when的情况下,该方法从新的"master"Deferred对象返回Promise,该对象跟踪它已经传递的所有Deferred的聚合状态.一旦所有Deferreds解决,该方法将解决其主延期,或者一旦Deferreds被拒绝,该方法将拒绝主延期.如果解析了主延迟,则传递传递给jQuery.when的所有Deferred的已解析值.例如,当Deferreds是jQuery.ajax()请求时,参数将是请求的jqXHR对象,按参数列表中给出的顺序排列.
在多个Deferreds案例中,其中一个Deferreds被拒绝,jQuery.when会立即触发其主Deferred的failCallbacks.请注意,此时某些延迟可能仍未解决.如果需要对此情况执行其他处理,例如取消任何未完成的ajax请求,则可以在闭包中保留对基础jqXHR对象的引用,并在failCallback中检查/取消它们.
资料来源:http://api.jquery.com/jquery.when/
因此,如果一个deferred对象解决了一个错误,那么就会master deferred发生火灾failCallbacks,由你来决定如何处理可能未解析的deferreds.