Как управлять порядком функций, вызываемых в jQuery $(document).ready
Мне нужно иметь возможность контролировать порядок элементов, обрабатываемых в событии $(document).ready
.
Это несколько элементов управления, загружаемых из нескольких файлов, причем все запрашиваются для вызова в событии ready
. Все они запускают асинхронный вызов на сервер (AJAX). Только после того, как все сделано, мне нужно сделать дополнительную работу.
Каким будет элегантное решение для этого?
Ответы
Ответ 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 и проверьте, равно ли это значение вашему общему числу вызовов, если оно выполняет вашу функцию полного завершения.