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ũ fadeOutrồi đến nội dung mới fadeIn. Nhưng tôi cũng cần getnội dung mới. Các fadeOutvà getlà 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ó). parallelsẽ 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 fadeOuthiệu ứng của jQuery và cũng là portlet.contentchứ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à fadeInnội dung mới.
Vì fadeOutkhô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 resultsmảng, theo thứ tự bạn đã chuyển các hàm.