2011-04-28 4 views
6

Mon script doit extraire plusieurs fichiers json sur https://graph.facebook.com/xxxx et récupérer un certain champ de chaque fichier json, puis calculer la somme.jQuery Plusieurs requêtes getJSON

Mon problème est de savoir comment imprimer le résultat une fois getJSON fait? Avec le code ci-dessous, il affichera 0. N'hésitez pas à suggérer de meilleures approches.

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

Pourriez-vous poster un exemple d'objet json? Même si Facebook est le plus grand réseau social, tous les utilisateurs, comme moi, ne sont pas inscrits sur Facebook. Thx – reporter

+0

L'exemple d'objet n'est pas pertinent :) voir la réponse ci-dessous – nixon

Répondre

23

En utilisant 1,5 jQuery objets différés:

cumulez un tableau des objets JQXHR retourné par $.getJSON()

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

et seulement $.when ils sont tous .done():

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

NB: cela va accumuler result dans l'ordre dans lequel les appels AJAX sont terminés, et non dans l'ordre dans lequel ils ont été passés.

+0

Est-ce seulement valable pour jQuery 1.5? en 1.10 ça ne marche pas. –

+1

@ João oui, il devrait fonctionner dans toutes les versions de 1.5+ – Alnitak

+0

@Alnitak comment puis-je gérer, si le getJson a échoué, car l'url n'existe pas? – Jacinto

3

Il ne fonctionne pas comme vous imprimez tout de suite le résultat, rappelez-vous que le code où vous concaténer le résultat est un rappel alors se déclenche après votre alerte.

À chaque rappel, vous devrez vérifier si tous ont terminé. remplacez l'appel alert() par votre traitement. :)

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); 
      } 
     }) 
    });