簡體   English   中英

在執行ajax調用返回錯誤時,從jquery for循環中斷

[英]Break from jquery for loop when doing an ajax call return error

看看下面的代碼。 問題很簡單,如果方法findUserInfo ajax代碼返回錯誤,如何從這個for循環中斷。 總之,我怎么能隨時打破這個for循環呢? 是因為ajax調用是異步的嗎?

 jQuery.each(d, function() {
    findUserInfo(this);
 });

function findUserInfo(userID){


var req = $.ajax({
url: "http://twitter.com/users/show.json?suppress_response_codes&id=xx!5@x!!x",
dataType : "jsonp"

});

req.success(function(msg) {
    console.log('Yes! Success!');

});

req.error(function(msg) {
    console.log('Error');
});


}   

是的,jQuery.ajax是異步的,所以你需要使用類似的東西:

function findUserInfos(datas){
  var userID=datas.shift(); //remove and return the first element

  var req = $.ajax({
    url: "http://twitter.com/users/show.json?suppress_response_codes&id=xx!5@x!!x",
    dataType : "jsonp"
  });

  req.success(function(msg) {
    console.log('Yes! Success!');
    findUserInfos(datas)
  });

  req.error(function(msg) {
    console.log('Error');
  });
}   

findUserInfos(d);

一旦出現錯誤,它就會破裂,因為我們只會繼續取得成功。

設置async:false是一個糟糕的主意。 它會導致瀏覽器在進行ajax調用時掛起。 Frame.js旨在解決這樣的問題:

jQuery.each(d, function() {
    findUserInfo(this);
});

Frame.useTimeout = false; // turn off Frame's error recovery

function findUserInfo(userID){

    Frame(function(next){

        var req = $.ajax({
        url: "http://twitter.com/users/show.json?suppress_response_codes&id=xx!5@x!!x",
        dataType : "jsonp"

        });

        req.success(function(msg) {
            console.log('Yes! Success!');
            next();
        });

        req.error(function(msg) {
            console.log('Error');
            // don't call next and Frame will stop
        });

    });

}  
Frame.init();

要從循環中斷開,返回false

如果在錯誤處理程序中拋出錯誤:

throw 'Error: ' + userID;

然后你可以寫

jQuery.each(d, function() {
    try {
        findUserInfo(this);
    } catch(err) {
      return false;
    }
 });

編輯:正如其他人評論的那樣,最好從成功處理程序返回true,從錯誤1返回false,然后調用return findUserInfo(this); 在循環內。 當然,如果您同步進行ajax調用,則可能會凍結瀏覽器。

如何將所有ID存儲為數組,將它們傳輸到服務器然后檢查給定結果!? 這節省了很多請求。 您可以將ID作為數組收集並通過POST ["id1","id2",...].join(",")傳輸它們["id1","id2",...].join(",")

或者您提前獲取所有內容並在獲取后開始循環...

由於你已經說過的異步性質,不可能打破循環... async:false; 也可以提供幫助,但它會阻止UI更新(由於許多請求會導致瀏覽器忙碌)

你可以通過為ajax調用設置async:false來使ajax調用同步。 您已經具有錯誤功能來捕獲所有異常。 所以我相信應該這樣做

           $.ajax({
            type: "GET",
            url: "/abc/GetNodesById",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            data: { "nodeId": '' },
            async: false,
            cache: false,
            success: function (data) {
              //Do Work
            }
            error : function(jqXHR, textStatus, errorThrown){
                // Handle Error
                // Return False 
            }
      });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM