Итак, у меня есть страница, которая загружается и через 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.