सारांश: क्या कुछ अच्छी तरह से स्थापित सर्वोत्तम-अभ्यास पैटर्न हैं जो मैं अतुल्यकालिक कोड और कॉलबैक का उपयोग करने के बावजूद अपने कोड को पठनीय रखने के लिए अनुसरण कर सकता हूं?
मैं एक जावास्क्रिप्ट लाइब्रेरी का उपयोग कर रहा हूं जो बहुत सारे सामान को अतुल्यकालिक रूप से और भारी रूप से कॉलबैक पर निर्भर करती है। ऐसा लगता है कि एक सरल "लोड ए, लोड बी, ..." लिखना इस पद्धति का उपयोग करने के लिए काफी जटिल और कठिन हो जाता है।
मुझे एक (आकस्मिक) उदाहरण दें। मान लीजिए कि मैं दूरस्थ वेब सर्वर से छवियों का एक गुच्छा (अतुल्यकालिक रूप से) लोड करना चाहता हूं। C # / async में, मैं कुछ इस तरह लिखूंगा:
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();
कोड लेआउट "घटनाओं का प्रवाह" इस प्रकार है: पहला, प्रारंभ बटन अक्षम है, फिर चित्र लोड किए गए हैं ( await
यह सुनिश्चित करता है कि यूआई उत्तरदायी रहता है) और फिर प्रारंभ बटन फिर से सक्षम है।
कॉलबैक का उपयोग करते हुए जावास्क्रिप्ट में, मैं इसके साथ आया:
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);
मुझे लगता है कि कमियां स्पष्ट हैं: मुझे एक पुनरावर्ती कॉल में लूप को फिर से काम करना था, जिस कोड को अंत में निष्पादित किया जाना चाहिए वह फ़ंक्शन के बीच में कहीं है, डाउनलोड शुरू करने वाला कोड ( loadImage(0)
) बहुत नीचे है, और यह आम तौर पर पढ़ने और पालन करने के लिए बहुत कठिन है। यह बदसूरत है और मुझे यह पसंद नहीं है।
मुझे यकीन है कि मैं इस समस्या का सामना करने वाला पहला व्यक्ति नहीं हूं, इसलिए मेरा सवाल है: क्या कुछ अच्छी तरह से स्थापित सर्वोत्तम-अभ्यास पैटर्न हैं जो मैं अतुल्यकालिक कोड और कॉलबैक का उपयोग करने के बावजूद अपने कोड को पठनीय रखने के लिए अनुसरण कर सकता हूं?
LoadImageAsync
है, वास्तव Ext.Ajax.request
में स्नेहा टच का एक कॉल है ।
async.waterfall
क्या आपका जवाब है।