2011-04-28 13 views
6

Mi script necesita buscar varios archivos json en https://graph.facebook.com/xxxx, y recuperar un determinado campo de cada json, luego calcular la suma.jQuery Solicitudes getJSON múltiples

Mi problema es cómo imprimir el resultado después de todo lo que hizo getJSON? Con el código a continuación se imprimirá 0. No dude en sugerir cualquier mejor enfoque.

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

¿Te importaría publicar un objeto json de ejemplo? A pesar de que Facebook es el mayor lado de la red social, no todos los usuarios, como yo, están registrados en Facebook. Thx – reporter

+0

objeto de ejemplo es irrelevante :) ver la respuesta a continuación – nixon

Respuesta

23

Usando jQuery 1.5 objetos diferidos:

acumulan una gran variedad de la JQXHR objetos devueltos por $.getJSON()

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

y sólo $.when todos son .done():

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

NB: esto acumulará result en el orden en que se completan las llamadas AJAX, no en el orden en que se realizaron.

+0

¿Esto solo es válido para jQuery 1.5? en 1.10 no funciona. –

+1

@ João sí, debería funcionar en todas las versiones desde 1.5+ – Alnitak

+0

@Alnitak ¿cómo puedo manejar, si el getJson falló, porque la url no existe? – Jacinto

3

No está funcionando como se va a imprimir el resultado inmediato, recuerde que el código en el que concatena el resultado es una devolución de llamada por lo que se dispara después de la alerta.

En cada devolución de llamada, deberá verificar si todas han finalizado. reemplace la llamada de alerta() con su procesamiento. :)

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