Итак, у меня есть страница, которая загружается, и через jquery.get выполняется несколько запросов для заполнения выпадающих списков с их значениями.
$(function() {
LoadCategories($('#Category'));
LoadPositions($('#Position'));
LoadDepartments($('#Department'));
LoadContact();
};
Затем он вызывает LoadContact(); Что делает другой вызов, и когда он возвращает, он заполняет все поля формы. Проблема в том, что часто выпадающие списки не все заполняются, и, следовательно, они не могут установить правильное значение.
Что мне нужно сделать, так или иначе LoadContact выполняется только после завершения всех остальных методов и выполнения обратных вызовов.
Но я не хочу добавлять кучу флагов в конце обратных вызовов сбрасываемых демонов, которые затем проверяю и должен иметь рекурсивную проверку вызовов SetTimeout до вызова LoadContact();
Есть ли что-то в jQuery, которое позволяет мне сказать: "Выполните это, когда все это сделано".
Дополнительная информация Я думаю что-то в этом духе
$().executeAfter(
function () { // When these are done
LoadCategories($('#Category'));
LoadPositions($('#Position'));
LoadDepartments($('#Department'));
},
LoadContact // Do this
);
... ему нужно будет отслеживать вызовы ajax, которые происходят во время выполнения методов, и когда все они будут завершены, вызовите LoadContact;
Если бы я знал, как перехватить ajax, который выполняется в этой функции, я мог бы, вероятно, написать расширение jQuery для этого.
Мое решение
;(function($) {
$.fn.executeAfter = function(methods, callback) {
var stack = [];
var trackAjaxSend = function(event, XMLHttpRequest, ajaxOptions) {
var url = ajaxOptions.url;
stack.push(url);
}
var trackAjaxComplete = function(event, XMLHttpRequest, ajaxOptions) {
var url = ajaxOptions.url;
var index = jQuery.inArray(url, stack);
if (index >= 0) {
stack.splice(index, 1);
}
if (stack.length == 0) {
callback();
$this.unbind("ajaxComplete");
}
}
var $this = $(this);
$this.ajaxSend(trackAjaxSend)
$this.ajaxComplete(trackAjaxComplete)
methods();
$this.unbind("ajaxSend");
};
})(jQuery);
Это связывается с событием ajaxSend при вызове методов и сохраняет список URL-адресов (нужен лучший уникальный идентификатор, хотя). Затем он отвязывает от ajaxSend, поэтому отслеживаются только те запросы, которые нас волнуют. Он также связывается с ajaxComplete и удаляет элементы из стека по мере их возвращения. Когда стек достигает нуля, он выполняет наш обратный вызов и отвязывает событие ajaxComplete.