Подтвердить что ты не робот

Как управлять порядком функций, вызываемых в jQuery $(document).ready

Мне нужно иметь возможность контролировать порядок элементов, обрабатываемых в событии $(document).ready.
Это несколько элементов управления, загружаемых из нескольких файлов, причем все запрашиваются для вызова в событии ready. Все они запускают асинхронный вызов на сервер (AJAX). Только после того, как все сделано, мне нужно сделать дополнительную работу.

Каким будет элегантное решение для этого?

4b9b3361

Ответ 1

Асинхронные запросы срабатывают по порядку, но возвращаются в том порядке, в котором они выполняются в первую очередь. Таким образом, не существует верного пути к тому, чтобы заставить их закончить в одно и то же время, однако вы можете создавать правила только для запуска кода после возвращения определенных групп.

Например, определите функцию обратного вызова с набором правил и передайте ее каждому обратному вызову success для всех ваших запросов ajax.

var completedObject = {};

function groupSuccessCallback() {
  // Test for any combination of requirements
  if ( completedObject.ajax1 && completedObject.ajax2 ) {
    ... // Do something that only requires 1 and 2
  }
  if ( completedObject.ajax1 && completedObject.ajax2 && completedObject.ajax3) { 
    ... // Do something that requires all 3 being done
        // your data is available at completedObject.ajax#
  }

  // Or test for _all_ entries for a dynamic count
  var allComplete = true;
  for(var i in completedObject) {
     if ( completedObject.hasOwnProperty(i) && !completedObject[i] ) {
       allComplete = false;
     }
  }

  // Do whatchya need.
  if (allComplete) { 
    alert("bb-b-bb-b-b-b-bbb... that all folks!");
  }
}

Затем установите флаги внутри своих функций успеха:

// Ajax1
completedObject['anything'] = false; // instantiate a dynamic entry in the object or use an array if you can't use names.
$.ajax({
  ...,
  ...,
  success: function(data) {
    completedObject['anything'] = data || true;
    groupSuccessCallback();
  }
});

Ответ 2

John Resig по порядку оценки функции в $(document).ready:

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

$. readyList - только в версиях до 1.4

jQuery выставил свойство под названием $.readyList, которое представляет собой массив, позволяющий манипулировать функциями orded, однако $. readyList больше не публикуется в jQuery 1.4 0,0

Хакерский путь

вы можете попробовать $(window).load(function () {});, он должен выполняться после того, как все окно загрузилось (не когда документ готов, так как он находится в $(document).ready()

Ответ 3

В зависимости от остальной части страницы выполнение этой дополнительной работы в $. ajaxStop может быть более элегантным.

Однако было бы нецелесообразно, если пользователь сможет и/или может инициировать последующие вызовы $.ajax(), пока эти начальные вызовы выполняются. В этом случае их вызванные вручную вызовы могут продлить событие $.ajaxStop дальше, чем предполагалось.

Ответ 4

Создайте переменную, которая содержит значение 0. В функции успеха каждого увеличения Ajax-вызова это значение равно 1 и проверьте, равно ли это значение вашему общему числу вызовов, если оно выполняет вашу функцию полного завершения.