【发布时间】:2011-02-15 15:11:42
【问题描述】:
所以,我有一个加载页面,并通过 jquery.get 发出几个请求以使用它们的值填充下拉列表。
$(function() {
LoadCategories($('#Category'));
LoadPositions($('#Position'));
LoadDepartments($('#Department'));
LoadContact();
};
然后调用 LoadContact();另一个调用,当它返回时填充表单上的所有字段。问题是,下拉列表通常不会全部填充,因此无法将它们设置为正确的值。
我需要做的是,以某种方式让 LoadContact 仅在其他方法完成并且回调完成执行后才执行。
但是,我不想在下拉人口回调的末尾放置一堆标志,然后我会检查这些标志,并且必须在调用 LoadContact() 之前进行递归 setTimeout 调用检查;
在 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 列表(需要一个更好的唯一 ID)。然后它与 ajaxSend 解除绑定,因此只跟踪我们关心的请求。它还绑定到 ajaxComplete 并在项目返回时从堆栈中删除它们。当堆栈达到零时,它会执行我们的回调,并取消绑定 ajaxComplete 事件。
【问题讨论】:
-
随机想...我的问题是我 4 个月前问的重复问题吗?
标签: javascript jquery asynchronous callback