2016-01-22 21 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