एक उत्तर में दूसरा प्रयास जिसमें मैं और अधिक व्याख्यात्मक होने की कोशिश करता हूं:
सबसे पहले, RSVP README से कुछ अपेक्षित पृष्ठभूमि :
वास्तव में भयानक हिस्सा तब आता है जब आप पहले हैंडलर से एक वादा वापस करते हैं ... यह आपको नेस्टेड कॉलबैक को समतल करने की अनुमति देता है, और उन वादों की मुख्य विशेषता है जो बहुत अतुल्यकालिक कोड वाले कार्यक्रमों में "सही बहाव" को रोकता है।
यह ठीक है कि आप वादों को क्रमिक कैसे बनाते हैं, बाद में उस वादे से किया गया वादा वापस करके then
जो इसके पहले पूरा होना चाहिए।
पेड़ के रूप में वादों के ऐसे सेट के बारे में सोचना मददगार है, जहां शाखाएं अनुक्रमिक प्रक्रियाओं का प्रतिनिधित्व करती हैं, और पत्तियां समवर्ती प्रक्रियाओं का प्रतिनिधित्व करती हैं।
इस तरह के वादों के वृक्ष के निर्माण की प्रक्रिया अन्य प्रकार के वृक्षों के निर्माण के बहुत सामान्य कार्य के अनुरूप होती है: जहाँ आप वर्तमान में शाखाओं को जोड़ रहे हैं, उस स्थान पर एक सूचक या संदर्भ बनाए रखें और पुनरावृत्तियाँ इसमें जोड़ें।
जैसा कि @Esailija ने अपने उत्तर में बताया, यदि आपके पास वादे-प्रतिफल करने वाले कार्यों की एक सरणी है, तो वे तर्क नहीं लेते हैं जिनका उपयोग आप reduce
बड़े करीने से आपके लिए पेड़ बनाने के लिए कर सकते हैं। यदि आपने कभी खुद के लिए कम लागू किया है, तो आप समझेंगे कि @ एस्लेइजा के जवाब में पर्दे के पीछे क्या कम हो रहा है, वर्तमान वादे ( cur
) के संदर्भ को बनाए रख रहा है और प्रत्येक वादा अपने अगले वादे को वापस कर रहा है then
।
यदि आपके पास सजातीय का एक अच्छा सरणी नहीं है (वे उन दलीलों के संबंध में / जो वे लेते हैं / वापस लौटते हैं) वादे वापस करने का कार्य करते हैं, या यदि आपको एक सरल रैखिक अनुक्रम की तुलना में अधिक जटिल संरचना की आवश्यकता है, तो आप खुद को बनाए रखकर वादों के पेड़ का निर्माण कर सकते हैं वादे के पेड़ की स्थिति का संदर्भ जहां आप नए वादे जोड़ना चाहते हैं:
var root_promise = current_promise = Ember.Deferred.create();
current_promise = current_promise.then(function(){
return
});
current_promise = current_promise.then(function(){
return
});
root_promise.resolve();
आप RSVP.all का उपयोग करके समवर्ती और अनुक्रमिक प्रक्रियाओं के संयोजन का निर्माण कर सकते हैं एक वादा "शाखा" में कई "पत्ते" जोड़ने के लिए। मेरा नीचा-से-बहुत जटिल जवाब इसका एक उदाहरण दिखाता है।
आप यह भी सुनिश्चित करने के लिए Ember.run.scheduleOnce ('afterRender') का उपयोग कर सकते हैं ताकि यह सुनिश्चित किया जा सके कि अगले वादे को पूरा करने से पहले एक वादे में कुछ किया जाता है - मेरा नीचा-से-बहुत जटिल जवाब भी इसका एक उदाहरण दिखाता है।