2012-09-08 53 views
2

我正在寫一個Sql轉換器,它處理mysql到mongodb。我用ajax寫了一個接口到我的轉換器。Jquery ajax在循環中

Ajax正在處理巨大的轉換。這限制了mysql選擇代碼並且一次進行1000次轉換。

我的代碼是:

$(document).ready(function() 
{ 
<!--Start JQuery Ajax Requests--> 
var pages; 
var type; 
$("input").click(function(event) { 
    pages = $(this).attr("icr"); 
    type = $(this).attr("id"); 
    runRequest(0); 
}); 

function runRequest(num){ 

    if (num > 3){ 
    $("#console").append("Finish!!!"); 
    return; 
    } 

    $.ajax 
    ({ 
    type: "POST", 
    url: "#", 
    async: false, 
    data: "type="+type+"&page="+num*1000, 
    success: function(msg){ 
     $("#console").ajaxComplete(function(event, request, settings) 
     { 
      $("#console").append(msg); 
      runRequest(num+1); 
     }); 
    } 
    }); 
} 
}); 

該代碼必須運行同一功能的3倍,乘以其發送的數量限制。但不知何故runRequest的num變量永遠不會達到3,螢火蟲控制檯顯示數量爲1或有時2,它重複無限。如何避免它,並使其只運行3個同步的呼叫?

+1

我不認爲這樣的「ajaxComplete」方法必須聲明爲你的「成功」回調:它是redondant與當前的回調。只是嘗試評論這一行,讓我們知道它是如何工作 – sdespont

+0

你的意思是我應該評論ajaxcomplete方法嗎?像這樣//$("#console").ajaxComplete(function(事件,請求,設置) –

+0

是的,事實是你每次到達成功回調函數都要聲明一個新的處理函數,它可能會產生一些問題 – sdespont

回答

1

我認爲問題在於你的使用.ajaxComplete()。根據jQuery docs,它是一個單獨的事件處理程序註冊方法。換句話說,你的成功功能是註冊一個事件在下一次完成時觸發。我認爲這也會導致你的第一個數據集被扔掉。

還有一點需要注意的是,您使用data參數傳入數據。這應該是一個對象,而不是查詢字符串。如果您使用GET Ajax調用,它將轉換爲查詢字符串。 url: "?type="+type+"&page="+num*1000,data: { "type": type, "page": num*1000 }是等同的。

嘗試重寫這樣說:

$.ajax({ 
    type: "POST" 
    url: "#", 
    async: false, 
    data: { "type": type, "page": num*1000 }, 
    success: function(msg) { 
     $("#console").append(msg); 
     runRequest(num+1); 
    }); 
} 

.ajaxComplete()方法更插入一個單獨的函數調用或行爲到每一個AJAX成功處理程序(如果你有在同一頁上很多這樣的要求和目的除了做正常的回調之外,還希望它們中的每一個都附加到控制檯上)。就像這樣:

$(document).ready(function() 
{ 
    $("#console").ajaxComplete(function(event, request, settings) 
    { 
     // $(this) is pointing to the #console ID because the function is bound to it 
     $(this).append('Triggered ajaxComplete handler. The result is ' + 
       xhr.responseHTML); 
     runRequest(num+1); 
    }); 
    // variables 

    // document event bindings/handlers 

    // Ajax functions (you could move this outside of the .ready function 

} 
+0

接受您的解決方案!還非常感謝Bouillou –

2

這裏的另一種方式:

for(i=0; i<5; i++) { 
    $.ajax({ 
     type: "GET", 
     url: '/api/foo/?bar=' + i, 
     ajaxI: i, 
     success: function(widgets) { 
      x = this.ajaxI; // now you can use x instead of i 

      // ... 
     } 
    }); 
}