jQuery с несколькими запросами getJSON

#javascript #jquery #json

#javascript #jquery #json

Вопрос:

Моему скрипту необходимо получить несколько файлов json на https://graph.facebook.com/xxxx и извлекают определенное поле из каждого json, затем вычисляют суммирование.

Моя проблема в том, как распечатать результат после выполнения всего getJSON? С приведенным ниже кодом он выведет 0. Не стесняйтесь предлагать какие-либо лучшие подходы.

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

Комментарии:

1. Не могли бы вы опубликовать пример объекта json? Несмотря на то, что Facebook является крупнейшей социальной сетью, не все пользователи, такие как я, зарегистрированы на facebook. Спасибо

2. пример объекта не имеет значения 🙂 смотрите ответ ниже

Ответ №1:

Использование отложенных объектов 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, а не в порядке их выполнения.

Комментарии:

1. @Alnitak как я могу справиться, если getJSON не удался, потому что URL-адрес не существует?

Ответ №2:

Это не работает, поскольку вы сразу печатаете результат, помните, что код, в котором вы объединяете результат, является обратным вызовом, поэтому сработает после вашего предупреждения.

При каждом обратном вызове вам придется проверять, все ли завершены. замените вызов 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);
            }
        })
    });