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

Я должен быть в состоянии управлять порядком пунктов, обрабатываемым в $(document).ready событие.
Это несколько средств управления, загруженных из нескольких файлов, все просящие быть призванными ready событие. Они все запускают асинхронный вызов к серверу (Ajax). Только после того, как они все сделаны, я должен сделать некоторую дополнительную работу.

Каково было бы изящное решение для этого?

12
задан Ron Harlev 23 February 2010 в 17:35
поделиться

4 ответа

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

Например, определите функцию обратного вызова с набором правил и передайте ее каждому успешному обратному вызову для всех ваших запросов 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's 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();
  }
});
7
ответ дан 2 December 2019 в 22:22
поделиться

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

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

1
ответ дан 2 December 2019 в 22:22
поделиться

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

0
ответ дан 2 December 2019 в 22:22
поделиться

Джон Ресиг о порядке вычисления функций в $ (document) .ready:

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

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

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

Хакерским способом

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

2
ответ дан 2 December 2019 в 22:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: