CẬP NHẬT Và hai năm sau, điều này có vẻ điên rồ vì câu trả lời được chấp nhận đã thay đổi thành một thứ tốt hơn nhiều! (Mặc dù vẫn không tốt bằng câu trả lời của Yair Leviel bằng cách sử dụng jQuery when
)
18 tháng sau, tôi vừa đánh một thứ tương tự. Tôi có một nút làm mới và tôi muốn nội dung cũ fadeOut
rồi đến nội dung mới fadeIn
. Nhưng tôi cũng cần get
nội dung mới. Các fadeOut
và get
là không đồng bộ, nhưng sẽ rất lãng phí thời gian để chạy chúng theo thứ tự.
Những gì tôi làm thực sự giống với câu trả lời được chấp nhận, ngoại trừ ở dạng một hàm có thể tái sử dụng. Đức tính chính của nó là nó ngắn hơn nhiều so với các đề xuất khác ở đây.
var parallel = function(actions, finished) {
finishedCount = 0;
var results = [];
$.each(actions, function(i, action) {
action(function(result) {
results[i] = result;
finishedCount++;
if (finishedCount == actions.length) {
finished(results);
}
});
});
};
Bạn truyền cho nó một mảng các hàm để chạy song song. Mỗi hàm nên chấp nhận một hàm khác mà nó chuyển kết quả (nếu có). parallel
sẽ cung cấp chức năng đó.
Bạn cũng chuyển cho nó một hàm được gọi khi tất cả các hoạt động đã hoàn thành. Điều này sẽ nhận được một mảng có tất cả các kết quả. Vì vậy, ví dụ của tôi là:
refreshButton.click(function() {
parallel([
function(f) {
contentDiv.fadeOut(f);
},
function(f) {
portlet.content(f);
},
],
function(results) {
contentDiv.children().remove();
contentDiv.append(results[1]);
contentDiv.fadeIn();
});
});
Vì vậy, khi nút làm mới của tôi được nhấp, tôi khởi chạy fadeOut
hiệu ứng của jQuery và cũng là portlet.content
chức năng của riêng tôi (thực hiện không đồng bộ get
, xây dựng một chút nội dung mới và chuyển nó vào), và sau đó khi cả hai hoàn tất, tôi xóa nội dung cũ, nối kết quả của chức năng thứ hai (có trong results[1]
) và fadeIn
nội dung mới.
Vì fadeOut
không chuyển bất cứ thứ gì đến hàm hoàn thành của nó, results[0]
có lẽ là chứa undefined
, vì vậy tôi bỏ qua nó. Nhưng nếu bạn có ba phép toán với kết quả hữu ích, chúng sẽ từng vị trí vào results
mảng, theo thứ tự bạn đã chuyển các hàm.