Có một cách tốt hơn để làm điều này là sử dụng các cuộc gọi ajax đồng bộ. Jquery ajax trả về giá trị hoãn lại để bạn có thể sử dụng chuỗi đường ống để đảm bảo rằng mỗi cuộc gọi ajax kết thúc trước lần chạy tiếp theo. Đây là một ví dụ làm việc với một ví dụ sâu hơn, bạn có thể play with on jsfiddle.
// How to force async functions to execute sequentially
// by using deferred pipe chaining.
// The master deferred.
var dfd = $.Deferred(), // Master deferred
dfdNext = dfd; // Next deferred in the chain
x = 0, // Loop index
values = [],
// Simulates $.ajax, but with predictable behaviour.
// You only need to understand that higher 'value' param
// will finish earlier.
simulateAjax = function (value) {
var dfdAjax = $.Deferred();
setTimeout(
function() {
dfdAjax.resolve(value);
},
1000 - (value * 100)
);
return dfdAjax.promise();
},
// This would be a user function that makes an ajax request.
// In normal code you'd be using $.ajax instead of simulateAjax.
requestAjax = function (value) {
return simulateAjax(value);
};
// Start the pipe chain. You should be able to do
// this anywhere in the program, even
// at the end,and it should still give the same results.
dfd.resolve();
// Deferred pipe chaining.
// What you want to note here is that an new
// ajax call will not start until the previous
// ajax call is completely finished.
for (x = 1; x <= 4; x++) {
values.push(x);
dfdNext = dfdNext.pipe(function() {
var value = values.shift();
return requestAjax(value).
done(function(response) {
// Process the response here.
});
});
}
Một số người đã nhận xét rằng họ không biết đầu vào của mã. Để hiểu nó, trước tiên bạn cần phải hiểu lời hứa javascript. Tôi khá chắc chắn hứa hẹn sẽ sớm trở thành một tính năng ngôn ngữ javascript bản địa, do đó sẽ cung cấp cho bạn một động lực tốt để tìm hiểu.
Nguồn
2012-09-26 20:53:58
Bạn biết những gì "A" trong AJAX là viết tắt của, phải :-) –
này chắc chắn tôi không phải là một câu trả lời, nhưng đó là một dấu hiệu thú vị của một framework được thiết kế tốt khi * this * là câu hỏi khó hiểu thay vì cách làm cho nó đồng thời. :) –
@Ed Swangren, vâng nhưng AJAX không phải là không đồng bộ, JavaScript hoặc XML. :-) – Nosredna