2013-06-20 27 views
1

我有幾個ajax調用,當它們成功時,我需要首先對所有的響應進行相同的檢查,然後,如果檢查不會失敗,對答覆做不同的事情。

在我使用在每個呼叫的success選項並插入此檢查在每個電話的那一刻,就像這樣:

$.ajax({ 
    success: function (data){ 
     if (response_has_errors(data)) 
      {return} 
     // do stuff 
    } 
}); 

所以,我有這樣的想法:使用$(document).ajaxSucces()做的同樣的檢查,然後使用$.ajax().done()success選項與每個呼叫。

但我需要$(document).ajaxSucces()中的處理程序始終首先執行,如果它返回false,則不執行單個處理程序。 我該怎麼做?

回答

1

首先,您應該確保您的服務器在響應實際上是錯誤時不會返回成功狀態(200 OK)。這爲您節省了一步處理。

然後你可以使用jQuery's when()一起處理請求。

$.when(
    $.ajax(...), $.ajax(...), $.ajax(...), $.ajax(...) 
) 
.then(function() (result1, result2, result3, result4) { 
    // all requests have successfully returned 
}) 
.fail(function() { 
    // handle error (inspect arguments) 
}) 
.always(function() { 
    // stop throbbers or other clean up work if necessary 
}); 

如果您以前從未使用過,請務必仔細閱讀Deferreds上的文檔。

請注意,您還可以使用apply()傳遞jQuery XHR的數組

$.when.apply($, allReqests).then(/* ... */); 
+0

不幸的是,我對服務器返回的內容沒有任何影響。另外,在我的解決方案中,我不太瞭解如何*首先*進行相同的檢查,然後*然後*單獨處理回覆。 – protasovams

+1

@protasovams如果你不能改變服務器的響應代碼,你可以(也應該)仍然使用[jQuery's * Deferred * architecture](http://api.jquery.com/category/deferred-object/)。這是一個可以清除一些事情的例子。 http://jsfiddle.net/XTVxt/ – Tomalak

+0

哇,非常感謝一個偉大的例子,它確實清除了一切。 – protasovams

1

我會建議使用「dataFilter」從$阿賈克斯():http://api.jquery.com/jQuery.ajax/

你可以把一些錯誤在這個dataFilter處理,如果失敗 - 直接在數據更新一些標誌,並有所有「成功」處理程序在執行之前檢查該標誌。

相關問題