使用`Deferred`进行错误处理

Ran*_*lue 2 jquery

Deferred对象有两个主要的回调池,即doneCallbacksfailCallbacks.两个池都是"线性的":回调按照给定的顺序依次存储.

这种线性结构似乎违背了处理错误时必须考虑的"树状"结构.每一步,都有两种情况:失败和通过.

if(err) {
     // stuff
     if(err) {
          // stuff
     } else {
          // stuff
     }
else {
     // stuff
     if(err) {
          // stuff
     } else {
          // stuff
     }
}
Run Code Online (Sandbox Code Playgroud)

似乎由于Deferreds 的强加线性,它们不太适合于错误处理.我忽略了什么吗?

Jas*_*per 5

这有点罗嗦,但这是来自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.