Özet: Eşzamansız kod ve geri aramalar kullanmamıza rağmen kodumu okunabilir tutmak için izleyebileceğim iyi kurulmuş en iyi uygulama kalıpları var mı?
Eşzamansız ve yoğun geri çağrılara dayanan bir çok şey yapan bir JavaScript kitaplığı kullanıyorum. Basit bir "A yükü, B yükü, ..." yöntemini yazmak oldukça karmaşık ve izlenmesi zorlaşıyor.
Bir örnek vereyim. Diyelim ki uzak bir web sunucusundan bir grup görüntü (eşzamansız olarak) yüklemek istiyorum. C # / async'de şöyle bir şey yazardım:
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();
Kod düzeni "olayların akışını" takip eder: İlk olarak, başlat düğmesi devre dışı bırakılır, daha sonra görüntüler yüklenir ( await
kullanıcı arayüzünün duyarlı kalmasını sağlar) ve ardından başlat düğmesi tekrar etkinleştirilir.
JavaScript'te, geri çağrıları kullanarak, bununla geldim:
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);
Dezavantajları açık olduğunu düşünüyorum: Ben özyinelemeli bir çağrı içine döngü yeniden çalışmak zorunda kaldı, sonunda yürütülmesi gereken kod fonksiyonun ortasında bir yerde, indirme ( loadImage(0)
) başlayan kod en altta, ve okumak ve takip etmek genellikle daha zordur. Çirkin ve hoşuma gitmedi.
Bu sorunla karşılaşan ilk kişi olmadığımdan eminim, bu yüzden sorum şu: Eşzamansız kod ve geri aramalar kullanmamıza rağmen kodumu okunabilir tutmak için takip edebileceğim iyi kurulmuş en iyi uygulama kalıpları var mı?
LoadImageAsync
aslında Ext.Ajax.request
Sencha Touch'a bir çağrı .
async.waterfall
senin cevaptır.