2010-08-22 126 views
3

我想執行一個循環與JSON查詢裏面。我的代碼看起來像這樣:Javascript Json內循環

for (var i = 0; i < numitems; i++) { 
    var currentitem = items[i]; 
    $.getJSON("http://localhost/items.php", {'itemname' : currentitem}, 
    function (json) { 
     alert (json); 
    }); 
} 

但似乎for循環不等待json查詢完成,並立即進入下一個。是否有可能實現一個循環(不一定是for循環),它執行當前的JSON查詢,並在從json接收到響應後進入數組中的下一個元素?

謝謝!

回答

6
function nextItem(i) 
{ 
    if(i < numitems) 
    { 
    var currentitem = items[i]; 
    $.getJSON("http://localhost/items.php", {'itemname' : currentitem}, 
     function (json) { 
     alert (json); 
     nextItem(i + 1); 
     }); 
    } 
} 

nextItem(0); 

把它放在你現在有for循環的同一個地方(不要移出這個函數)。

+0

良好的舊遞歸。我會給這個嘗試..似乎它應該完美地工作。 – 2010-08-23 00:02:24

0

$ .getJSON是一個異步調用,這意味着它幾乎立即返回,但直到一段時間後纔會完成。這就是爲什麼你傳遞一個回調 - 回調(即你在第4行傳遞的函數)是AJAX請求實際完成時執行的。 The docs有一些更多的細節。

你會想在這裏重新考慮你的策略:如果你希望這些請求一次執行一次,那麼每個請求都需要從之前的回調中調用。或者你只需​​要處理回調的異步性;它可能非常有用。

0

getJSON是異步的。循環不會等待JSON響應。

你的代碼應該仍然有效,但是你的alert()會被延遲。

如果你想讓它等待響應,你需要通過你的列表,以回調函數迭代(我的例子可能不會工作)

var items = [ "im", "not", "sure", "whats", "in", "here" ]; 

function bahJSON(index) { 
    if (!index) index=0; 
    var currentItem = items[index]; 
    $.getJSON("http://localhost/items.php", {"itemname": currentItem }, 
    function(json) { 
     alert(json); 
     if (index<items.length) { 
     bahJSON(index+1); 
     } 
    }); 
} 
bahJSON(); 
0

下以前後執行一個JSON響應JSON響應已完成:

function nextItem(i) { 
var currentitem = items[i]; 
$.ajax({ 
     type: "POST", 
     contentType: "application/json; charset=utf-8", 
     url: "http://localhost/items.php", 
     data: "{'itemname' : currentitem}", 
     dataType: "json", 
     complete: function() { 
      if (i<numitems) { 
       i++; 
      nextItem(i); 
     } 

     }, 
     error: function(request, status, errorThrown) { 
      alert(status); 
     } 
    }); 
}