2012-11-01 43 views
1

我想在一個循環中執行一個Ajax函數,我希望我的循環只有在ajax調用完成時才轉到下一條指令。我試圖把ajax async設置爲false,但是我的加載消息沒有出現,並且當循環的所有迭代完成時我的屏幕刷新。如果async設置爲true,它將同時執行所有操作。循環內的JQuery Ajax

這裏是我的代碼:

function pingAll(url) 
{ 
    var arrIDs = new Array(); 
    var pattern = /[0-9]+/g; 

    $("input:checkbox[name=checkbox-router]:checked").each(function() 
    { 
     var strCheckboxID = $(this).attr('id'); 
     var routerID = strCheckboxID.match(pattern); 
     arrIDs.push(routerID); 
    }); 

    for (var i in arrIDs) 
    { 
     pingRouter(url + arrIDs[i], arrIDs[i]); 
    } 
} 

function pingRouter(url, shortID) 
{ 
    $('#ping-resp-' + shortID).html('Loading...'); 
    var pingRequestTimeout = $('#pingRequestTimeout').val();  
    url = url + "?timeout=" + pingRequestTimeout; 

    $.ajax 
    ({ 
     url: url, 
     async: true, 
     success: function(data) 
     { 
      var objData = $.parseJSON(data); 
      var response = objData.response.replace(/(\r\n|\n|\r)/gm,"") 
      . 
      . 
      . 
      var latency = parseFloat(objData.latency); 
      $('#ping-resp-' + shortID).html(latency + ' ms'); 
     } 
    }); 
    return; 
} 

感謝您的幫助。

+0

您需要以某種方式製作此並行程序,例如使用setTimeout並保留Global var以跟蹤Loop中的元素。 – Burimi

回答

0

你可以按如下方式使用遞歸:

function pingRouter(baseurl, arrIDs , i) { 
    if(i < 0 || i > arrIDs.length - 1) { 
     return; 
    } 
    var url = baseurl + arrIDs[i]; 
    var shortID = arrIDs[i]; 

    $('#ping-resp-' + shortID).html('Loading...'); 
    var pingRequestTimeout = $('#pingRequestTimeout').val();  
    url = url + "?timeout=" + pingRequestTimeout; 

    $.ajax 
    ({ 
     url: url, 
     async: true, 
     success: function(data) 
     { 
      var objData = $.parseJSON(data); 
      var response = objData.response.replace(/(\r\n|\n|\r)/gm,"") 
      . 
      . 
      . 
      var latency = parseFloat(objData.latency); 
      $('#ping-resp-' + shortID).html(latency + ' ms'); 

     } 
    }).always(function() { 
     if(i < arrIDs.length + 1) { 
      pingRouter(baseurl, arrIDs , i + 1); 
     } 
    }); 
    return; 

} 

和更改您的通話功能:

pingRouter(url, arrIDs, 0); 

見API爲always

+0

它的工作原理!謝謝!! – DiegoAraujo