Vì vậy, tôi có một trang tải và thông qua jquery.get thực hiện một số yêu cầu để điền các menu thả xuống với các giá trị của chúng.Đang đợi nhiều cuộc gọi không đồng bộ để hoàn thành trước khi tiếp tục
$(function() {
LoadCategories($('#Category'));
LoadPositions($('#Position'));
LoadDepartments($('#Department'));
LoadContact();
};
Sau đó gọi hàm LoadContact(); Cuộc gọi nào khác và khi nó trả về, nó sẽ điền tất cả các trường vào biểu mẫu. Vấn đề là thường xuyên, các trình đơn thả xuống không phải là tất cả dân cư, và do đó, nó không thể đặt chúng vào giá trị chính xác.
Những gì tôi cần để có thể làm, bằng cách nào đó có LoadContact chỉ thực thi khi các phương thức khác hoàn tất và gọi lại thực hiện xong.
Nhưng, tôi không muốn phải đặt một loạt cờ vào cuối các cuộc gọi lại, sau đó kiểm tra và phải kiểm tra cuộc gọi setTimeout đệ quy, trước khi gọi LoadContact() ;
Có điều gì đó trong jQuery cho phép tôi nói, "Thực hiện điều này, khi tất cả những việc này được thực hiện".
More Info Tôi đang nghĩ đến một cái gì đó dọc theo những dòng
$().executeAfter(
function() { // When these are done
LoadCategories($('#Category'));
LoadPositions($('#Position'));
LoadDepartments($('#Department'));
},
LoadContact // Do this
);
... nó sẽ cần phải theo dõi các cuộc gọi ajax điều đó xảy ra trong quá trình thực hiện các phương pháp, và khi họ là tất cả hoàn thành, gọi LoadContact;
Nếu tôi biết cách đánh chặn ajax đang được thực hiện trong hàm đó, tôi có thể viết một phần mở rộng jQuery để thực hiện việc này.
My Giải pháp
;(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);
này liên kết với các sự kiện ajaxSend trong khi các phương pháp đang được kêu gọi và giữ một danh sách các url (cần một id duy nhất tốt hơn mặc dù) được gọi. Nó sau đó unbinds từ ajaxSend để chỉ các yêu cầu chúng tôi quan tâm được theo dõi. Nó cũng liên kết với ajaxComplete và xóa các mục khỏi ngăn xếp khi chúng trở về. Khi stack đạt đến số không, nó thực hiện gọi lại của chúng ta, và hủy liên kết sự kiện ajaxComplete.
Câu hỏi ngẫu nhiên ... câu hỏi của tôi trùng lặp như thế nào khi tôi hỏi 4 tháng trước đó? – CaffGeek