Tóm tắt: Có một số mẫu thực hành tốt nhất được thiết lập tốt mà tôi có thể làm theo để giữ cho mã của mình có thể đọc được mặc dù sử dụng mã không đồng bộ và gọi lại không?
Tôi đang sử dụng thư viện JavaScript thực hiện nhiều nội dung không đồng bộ và phụ thuộc nhiều vào các cuộc gọi lại. Có vẻ như việc viết một phương thức "tải A, tải B, ..." đơn giản trở nên khá phức tạp và khó thực hiện khi sử dụng mẫu này.
Hãy để tôi đưa ra một ví dụ (giả định). Giả sử tôi muốn tải một loạt các hình ảnh (không đồng bộ) từ một máy chủ web từ xa. Trong C # / async, tôi sẽ viết một cái gì đó như thế này:
disableStartButton();
foreach (myData in myRepository) {
var result = await LoadImageAsync("http://my/server/GetImage?" + myData.Id);
if (result.Success) {
myData.Image = result.Data;
} else {
write("error loading Image " + myData.Id);
return;
}
}
write("success");
enableStartButton();
Bố cục mã theo "luồng sự kiện": Đầu tiên, nút bắt đầu bị vô hiệu hóa, sau đó hình ảnh được tải ( await
đảm bảo rằng giao diện người dùng vẫn phản hồi) và sau đó nút bắt đầu được bật lại.
Trong JavaScript, sử dụng các cuộc gọi lại, tôi đã đưa ra điều này:
disableStartButton();
var count = myRepository.length;
function loadImage(i) {
if (i >= count) {
write("success");
enableStartButton();
return;
}
myData = myRepository[i];
LoadImageAsync("http://my/server/GetImage?" + myData.Id,
function(success, data) {
if (success) {
myData.Image = data;
} else {
write("error loading image " + myData.Id);
return;
}
loadImage(i+1);
}
);
}
loadImage(0);
Tôi nghĩ rằng những hạn chế là rõ ràng: Tôi đã phải thực hiện lại vòng lặp thành một cuộc gọi đệ quy, mã được cho là được thực thi cuối cùng nằm ở đâu đó ở giữa hàm, mã bắt đầu tải xuống ( loadImage(0)
) ở dưới cùng, và nó thường khó đọc và theo dõi hơn nhiều. Nó xấu và tôi không thích nó.
Tôi chắc chắn rằng tôi không phải là người đầu tiên gặp phải vấn đề này, vì vậy câu hỏi của tôi là: Có một số mẫu thực hành tốt nhất được thiết lập tốt mà tôi có thể làm theo để giữ cho mã của mình có thể đọc được mặc dù sử dụng mã không đồng bộ và gọi lại không?
LoadImageAsync
trên thực tế là một cuộc gọi đến Ext.Ajax.request
Sencha Touch.
async.waterfall
là câu trả lời của bạn.