Проблема jQuery с (а) синхронными вызовами методов - PullRequest
3 голосов
/ 29 июня 2011

У меня странное поведение, которое выглядит как проблема с (а) синхронными вызовами методов?!? Я не уверен! Функция получает данные с помощью getJSON, обрабатывает эти данные, добавляет их в таблицу, которую можно сортировать с помощью плагина сортировки таблиц (http://tablesorter.com/).

Здесь некоторые части кода. Функция получает данные с помощью getJSON:

jQuery.getJSON(url,{},function(data)
              {
             success:{ ....

в блоке успеха данные будут обрабатываться в цикле for-each. во время этого цикла for-each каждый элемент JSON будет обрабатываться (doSomething ()) и добавляться в таблицу HTML:

success:{ [some-code]
          $.each (data.words, function (i,n) 
                              {result=doSomething(n);
                               obj=jQuery('#Template').clone().appendTo('#table');
                               obj.html(result);
                              }

наконец, после этого для каждого я должен обновить расширение таблицы-сортировщика и начать новую сортировку:

         jQuery("#table").trigger("update");
         $("#table").trigger("sorton",[[[1,1]]]);
}; //end of "success

Этот код упрощен. Проблема в том, что $("#table").trigger("sorton",[[[1,1]]]); работает правильно, только если я запускаю эту функцию с задержкой setTimeout('$("#trends").trigger("sorton",[[[1,1]]]);',20);.

Я думаю, что вывод obj.html(result); будет асинхронным. Поэтому, если я запускаю функцию сортировки без setTimeout, функция сортировки не находит данных во время выполнения.

Есть ли способ сделать этот блок успеха линейным?

Спасибо за любую помощь !!

Ответы [ 2 ]

2 голосов
/ 02 июля 2011

Если вы посмотрите на источник сортировщика таблиц, в событии обновления есть setTimeout, что, скорее всего, влияет на ваш вызов для сортировки таблицы.

$this.bind("update", function () {
    var me = this;
    setTimeout(function () {
    // rebuild parsers.
        me.config.parsers = buildParserCache(
        me, $headers);
        // rebuild the cache map
        cache = buildCache(me);
    }, 1);

Полный взлом - добавить сортировку в конец этого блока кода.Я не уверен, что смогу предложить более элегантное решение, но хотел бы поделиться этим открытием с вами.

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

Я думаю, вы более или менее решили свою проблему.Поместите весь свой успех: код обратного вызова в функцию и укажите эту функцию в атрибуте успеха.Вызов getJSON () является асинхронным, поэтому, когда он завершается, для его вызова должна существовать существующая функция.

Под этим я подразумеваю следующее:

success: doSuccess();

, а не это:

success: function() {}

В качестве альтернативы вы можете сделать вызов синхронным, если хотите, посмотрите это: Существует ли версия $ getJSON, которая не использует обратный вызов?

...