Подождите, пока запрос .each () .getJSON завершится, прежде чем выполнять обратный вызов. - PullRequest
2 голосов
/ 24 июня 2011

У меня есть цикл jquery .each, который извлекает удаленные данные из запроса json для всех элементов на странице с определенным классом. Один набор элементов представляет собой группу тегов li, которые я хотел бы отсортировать, используя другую функцию после обновления элемента li удаленной информацией.

Передача функции сортировки после цикла .each не сортирует список, поскольку элементы не закончили загрузку из запроса json. Сортировка работает Если я передаю функцию сортировки как обратный вызов .complete для запроса getJSON, но я хочу, чтобы сортировка запускалась один раз для всего списка, а не для каждого элемента.

fetch_remote_data(function(){sort_list_by_name();});

function fetch_remote_data(f){
jQuery('.fetching').each(function(){
   var oj = this;
   var kind = this.getAttribute('data-kind');
   var url = "http://something.com"
   jQuery.getJSON(url, function(json){
       $(oj).text(json[kind]);
       $(oj).toggleClass('fetching');
   });
});
 if (typeof f == 'function') f();
};

Есть предложения?

Ответы [ 2 ]

5 голосов
/ 24 июня 2011

Если вы используете jQuery 1.5, вы можете воспользоваться его реализацией $ .Deferred:

function fetch_remote_data(f) {
  var requests = [],
      oj = this,
      url = "http://something.com";

  $('fetching').each(function() {
    var request = $.getJSON(url, function(json) {
      $(oj).text(json['name']);
      $(oj).toggleClass('fetching');
    });

    requests.push(request);
  });

  if (typeof f === 'function') 
    $.when(requests).done(f);
}

// No need to wrap this in another function.
fetch_remote_data(sort_list_by_name);

Я предполагаю, что бит $('fetching') в вашем примере не является реальным кодом? Этот селектор будет искать <fetching> элементов в DOM, что, вероятно, не то, что вам нужно.

0 голосов
/ 24 июня 2011

Попытайтесь получить общее количество выборок, которые должны быть выполнены до запуска каждого ().Затем прикрепите обратный вызов .complete, в котором вы сначала увеличиваете количество выполненных запросов и сортируете их только в том случае, если количество выполненных операций равно общему числу, которое должно быть выполнено.В принципе, вы должны запускать sort только после того, как все вызовы ajax завершены ... K

...