Rangkuman: Apakah ada beberapa pola praktik terbaik yang mapan yang dapat saya ikuti untuk menjaga kode saya tetap terbaca meskipun menggunakan kode dan panggilan balik asinkron?
Saya menggunakan perpustakaan JavaScript yang melakukan banyak hal secara tidak sinkron dan sangat bergantung pada panggilan balik. Tampaknya menulis metode "memuat A, memuat B, ..." yang sederhana menjadi cukup rumit dan sulit diikuti dengan menggunakan pola ini.
Biarkan saya memberi contoh (buat). Katakanlah saya ingin memuat banyak gambar (asinkron) dari server web jarak jauh. Di C # / async, saya akan menulis sesuatu seperti ini:
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();
Tata letak kode mengikuti "aliran acara": Pertama, tombol mulai dinonaktifkan, kemudian gambar dimuat ( await
memastikan bahwa UI tetap responsif) dan kemudian tombol mulai diaktifkan lagi.
Dalam JavaScript, menggunakan callback, saya menemukan ini:
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);
Saya pikir kekurangannya jelas: saya harus mengolah ulang loop menjadi panggilan rekursif, kode yang seharusnya dieksekusi pada akhirnya adalah suatu tempat di tengah fungsi, kode mulai unduhan ( loadImage(0)
) ada di bagian paling bawah, dan umumnya jauh lebih sulit untuk dibaca dan diikuti. Itu jelek dan saya tidak suka itu.
Saya yakin bahwa saya bukan orang pertama yang menghadapi masalah ini, jadi pertanyaan saya adalah: Apakah ada beberapa pola praktik terbaik yang dapat saya ikuti untuk menjaga kode saya tetap terbaca meskipun menggunakan kode asinkron dan panggilan balik?
LoadImageAsync
sebenarnya adalah panggilan untuk Ext.Ajax.request
Sencha Touch.
async.waterfall
adalah jawaban Anda.