2016-01-22 69 views
1

在我的代码中,如果任何延迟失败,它会进入失败块并且一切都会丢失。我想要的是,忽略失败的成功者。任何优雅的方式来做到这一点?如果所有推迟失败,我将如何去失败的块。 一个解决方法可能是采取一个for循环,并逐个处理deferredItems数组,但这并不是优雅的方式。在处理延迟数组的同时获得成功的延迟并忽略失败的代码

$.when.apply($, deferredItems).done(function(){ 

}).fail(function(errorObj) { 

}); 
+1

没有什么内置到jQuery中,如果一个延迟失败,'$ .when'也如此,这就是它的设计方式 – adeneo

回答

1

可以使用。总是,然后找到其被解决的,如你所说

$.when.apply($, deferredItems).always(function(){ 
    var resolvedDeferreds = $.grep(deferredItems, function(deferred){ 
    return deferred.state() === 'resolved'; 
    }); 

    //do stuff with resolved deferreds 
}) 

编辑:

原来这是行不通的。一旦延迟失败并且不等待剩余的待决延期,立即调用.always回调。看起来像没有办法等待一系列的被攻击者全部得到解决或仅仅使用jquery.when原样被拒绝。

+0

如果所有推迟失败,我需要去失败块,有无论如何,我可以切换到失败块,如果我没有得到任何解决。? – Ahmad

1

使用.always()

$.map([a, b], function(d) { 
    $.when(d).always(function(data) { 
    console.log(data) 
    }) 
}) 
+0

jsfiddle https://jsfiddle.net/2y49xo17/,https://jsfiddle.net/2y49xo17/1/ – guest271314

+0

,如果所有推迟失败,我需要去失败块,有无论如何,我可以切换到失败块,如果我没有得到任何解决。 – Ahmad

+0

@Ahmad在'.always()中尝试使用'if..else' https://jsfiddle.net/2y49xo17/2/ – guest271314