2016-03-07 86 views
0

我一直在嘗試對這個問題進行排序2天。但事情似乎並沒有爲我工作。jQuery Ajax - 不能在循環內工作

我附加的代碼在循環外工作得很好,但是當我在循環中使用它時,它根本無法按我想要的方式工作,並將空數組記錄到控制檯中。

另一方面,在我的ajax請求中使用「async:false」會使代碼正常工作,並在控制檯中輸出完全正常的數組,但正如你所知,使用「async:false」已被棄用,並完全凍結UI直到該請求未完成。

任何其他解決方案,而不是將async設置爲false?

for (var i = 0; i <= splittedURLSLength; i++) { 
      var extracted = extractUsername(splittedURLS[i]); 
      postData = {'name' : extracted}; 
      ajaxRequest = $.when($.ajax({ 
      url: "/check", 
      type: "POST", 
      data: postData 
      })).then(function(returnedResponse) { 
       if (returnedResponse == "1") { 
        resultsArray.push(extracted); 
       } 
      }); 
} 
console.log(resultsArray); 
+3

第一個「一」,在「AJAX」代表「* *異步**」。您的數組可能正在填充(假設您沒有收到任何服務器錯誤),但console.log()調用將在HTTP請求完成之前發生。 – Pointy

+0

異步調用在後臺繼續,而腳本繼續而不等待結果。 (這是簡化的,但應該足夠適用於您的問題) – Burki

回答

0

只是另一個想法解決它......

var resultsArray[]//Global or should be pass to the function... 

myIterate(0); 

function myIterate(idx){ 
    var i = idx; 
    if (i < splittedURLS.length){ 
     var extracted = extractUsername(splittedURLS[i]); 
     postData = {'name' : extracted}; 
     ajaxRequest = $.when($.ajax({ 
     url: "/check", 
     type: "POST", 
     data: postData 
     })).then(function(returnedResponse) { 
      if (returnedResponse == "1") { 
       resultsArray.push(extracted); 
       myiterate(i++); 
      } 
     }); 
    } 
} 
console.log(resultsArray); 
+0

因此我將循環體包裝在一個函數中。和賓果!它像一個魅力。非常感謝你的迴應。順便說一句,你能告訴我包裹身體功能的邏輯是什麼?爲什麼它沒有包裝在一個函數中不起作用? – abhanan93

+0

其實我沒有把它包起來......我把它稱爲遞歸的......我喜歡「MPJ」在這裏解釋它:[遞歸 - JavaScript函數式編程的第7部分](https://www.youtube.com /手錶?ν= K7-N8R0-KY4)。 另外:[遞歸(計算機科學)](https://en.wikipedia.org/wiki/Recursion_(computer_science)) 它只是允許ajax在它進入數組中的下一個URL之前自行執行。 –

1

你所面對的問題是,因爲你正在登錄resultsArray到控制檯之前,它被裝滿了來自AJAX請求的值。下面的代碼會給你如何從響應 - 使用數據

for (var i = 0; i <= splittedURLSLength; i++) { 
     var extracted = extractUsername(splittedURLS[i]); 
     postData = {'name' : extracted}; 
     ajaxRequest = $.when($.ajax({ 
          url: "/check", 
          type: "POST", 
          data: postData 
         })).then(function(returnedResponse) { 
          if (returnedResponse == "1") { 
           resultsArray.push(extracted); 
           showResults(resultsArray); 
          } 
         }); 
} 

function showResults(resultsArray) { 
    console.log(resultsArray); 
    //Process your resultsArray as per requirement. 
} 
1

由於AJAX請求是異步的,第一個AJAX請求回來之前,你的console.log將觸發一個簡短的想法。這是事件循環在Javascript中的工作方式。

你需要你的邏輯進入你的成功處理程序:

for (var i = 0; i <= splittedURLSLength; i++) { 
     var extracted = extractUsername(splittedURLS[i]); 
     postData = {'name' : extracted}; 
     ajaxRequest = $.when($.ajax({ 
     url: "/check", 
     type: "POST", 
     data: postData 
     })).then(function(returnedResponse) { 
      if (returnedResponse == "1") { 
       resultsArray.push(extracted); 
      } 
      if(i === splittedURLSLength){ 
       console.log(resultsArray); 
      } 
     }); 
+0

感謝您的回覆。順便說一句,「resultsArray」忽略了等於splittedURLSLength的機會,因爲returnedResponse可以是0或1. – abhanan93

+0

好的結果。編輯我的帖子,以反映這一點。 –