2011-04-28 73 views
6

我的腳本需要獲取https://graph.facebook.com/xxxx上的幾個json文件,並從每個json中檢索某個字段,然後計算求和。jQuery多個getJSON請求

我的問題是如何打印出getJSON完成後的結果?下面的代碼將打印0.隨意提出任何更好的方法。

var result = 0; 
$.each(urls, function (i, url) { 
    $.getJSON(url, function (json) { 
     result += json.field1; 
    }) 
}); 
alert(result); 
+0

你介意發佈一個示例json對象嗎?儘管Facebook是最大的社交網絡端,但並不是所有的用戶(如我)都在facebook上註冊。 Thx – reporter 2011-04-28 11:30:03

+0

示例對象無關:)請參閱下面的回答 – nixon 2011-04-28 11:30:36

回答

23

使用jQuery 1.5推遲對象:

積累JQXHR對象數組由$.getJSON()

var jxhr = urls.map(function(url) { 
    return $.getJSON(url, function(json) { 
     result += json.field1; 
    }) 
}); 

只有$.when返回他們都.done()

$.when.apply($, jxhr).done(function() { 
    alert(result); 
}); 

注:這將累積result的順序是AJAX調用完成,而不是按它們的順序。

+0

這僅適用於jQuery 1.5嗎?在1.10它不工作。 – 2014-07-26 15:44:33

+1

@João是的,它應該可以在1.5+以上的所有版本中工作 – Alnitak 2014-07-26 19:25:16

+0

@Alnitak我可以如何處理,如果getJson失敗,因爲url不存在? – Jacinto 2017-04-28 16:06:29

3

它不工作,你的打印結果馬上,請記住,在那裏您連接結果的代碼是一個回調等都將您的警報後觸發。

在每次回調中,您都必須檢查是否全部完成。將alert()調用替換爲您的處理。 :)

var result = 0; 
    var doneCount = 0; 

    $.each(urls, function (i, url) { 
     $.getJSON(url, function (json) { 
      doneCount++; 
      result += json.field1; 
      if (doneCount == urls.length) { 
       alert(result); 
      } 
     }) 
    });