Trước tiên, tôi phải thừa nhận, tôi tương đối mới với JavaScript, nhưng gần đây tôi đã gặp phải cùng một vấn đề trong khi sử dụng chức năng jQuery ajax. Tôi phải tải lên một vài tài liệu qua POST tới máy chủ theo một thứ tự nhất định. Làm tổ tất cả các cuộc gọi lại sẽ tạo ra mã hoàn toàn sai lầm. Tôi nghĩ về một giải pháp sau khi đọc các câu trả lời và đưa ra một giải pháp làm việc tốt cho tôi. Nó chỉ sử dụng một hàm có mệnh đề chuyển đổi để phân biệt các lời gọi lại khác nhau:
var callback = function(sCallIdentifier, callbackParameters){
switch(sCallIdentifier){
case "ajaxOne":
doYourStuff(callbackParameters); //do your stuff for ajaxOne
ajaxTwo(function(newCallbackParameters){
/*define a anonymous function as actual method-callback and pass the call-identifier, together with all parameters, to your defined callback function*/
callback("ajaxTwo", newCallbackParameters);
});
break;
case "ajaxTwo":
doYourStuff(callbackParameters);
ajaxThree(function(newCallbackParameters){
callback("ajaxThree", newCallbackParameters);
});
break;
case "ajaxThree":
doYourStuff();
break;
}
});
Nếu đây không phải là ý hay, hãy cho tôi biết. Như tôi đã nói, tôi không phải là chuyên gia về JavaScript nhưng tôi đã làm việc rất tốt cho tôi.
nhất, René
Edit:
Sau một thời gian tôi phát hiện ra rằng Promises là một cách tiếp cận tốt hơn để giải quyết vấn đề này.
Mặc dù cách tiếp cận đó có nhiều nỗ lực hơn để làm, nhưng nó chắc chắn rất đẹp và sạch sẽ :) Nhưng nó không thực sự là vấn đề "lập trình chức năng". – selfawaresoup
Điều này trông thật sự tuyệt vời, nhưng tôi không thể tìm ra cách lớp học hoãn lại hoạt động trong nội bộ. –
Một cái nhìn tại nguồn của jsdeferred (http://github.com/cho45/jsdeferred/blob/master/jsdeferred.js) cho bạn biết rằng hàm tiếp theo chỉ đợi cuộc gọi ajax đầu tiên đến (sử dụng setTimeout) và sau đó gửi tiếp theo. – fbuchinger