प्रश्न के शीर्षक के आधार पर, "एक के बाद एक वादों को हल करें (यानी अनुक्रम में?"), हम यह समझ सकते हैं कि ओपी प्रति सेकंड अनुक्रमिक कॉल की तुलना में निपटान पर वादों के अनुक्रमिक हैंडलिंग में अधिक रुचि रखता है। ।
यह उत्तर दिया जाता है:
- यह प्रदर्शित करने के लिए कि अनुक्रियाओं के अनुक्रमिक संचालन के लिए अनुक्रमिक कॉल आवश्यक नहीं हैं।
- इस पृष्ठ के आगंतुकों के लिए व्यवहार्य वैकल्पिक पैटर्न को उजागर करने के लिए - ओपी सहित अगर वह अभी भी एक साल बाद भी रुचि रखता है।
- ओपी के इस दावे के बावजूद कि वह कॉल को समवर्ती नहीं बनाना चाहते हैं, जो वास्तव में मामला हो सकता है लेकिन समान रूप से प्रतिक्रियाओं की अनुक्रमिक हैंडलिंग की इच्छा के आधार पर एक धारणा हो सकती है जैसा कि शीर्षक का अर्थ है।
यदि समवर्ती कॉल वास्तव में नहीं चाहते हैं तो बेंजामिन ग्रुएनबाम का उत्तर देखें, जो अनुक्रमिक कॉल (आदि) को व्यापक रूप से कवर करता है।
हालांकि, आप उन प्रतिमानों (बेहतर प्रदर्शन के लिए) में रुचि रखते हैं जो समवर्ती कॉल के बाद अनुक्रियाओं के अनुक्रमिक संचालन की अनुमति देते हैं, तो कृपया इसे पढ़ें।
यह सोचने के लिए आपको लुभावना है कि आपको उपयोग करना होगा Promise.all(arr.map(fn)).then(fn)
(जैसा कि मैंने कई बार किया है) या प्रोमिस लिबास की फैंसी चीनी (विशेषकर ब्लूबर्ड्स), हालांकि, इस लेख के क्रेडिट के साथ एक arr.map(fn).reduce(fn)
पैटर्न काम करेगा, इसके फायदे इसके साथ हैं:
- किसी भी वादे के साथ काम करता है - यहां तक कि jQuery के पूर्व-अनुरूप संस्करणों - केवल
.then()
उपयोग किया जाता है।
- लचीलेपन को स्किप-ओवर-एरर या स्टॉप-ऑन-एरर में सुधारता है, जो भी आप एक पंक्ति मॉड के साथ चाहते हैं।
यहाँ यह है, के लिए लिखा है Q
।
var readFiles = function(files) {
return files.map(readFile) //Make calls in parallel.
.reduce(function(sequence, filePromise) {
return sequence.then(function() {
return filePromise;
}).then(function(file) {
//Do stuff with file ... in the correct sequence!
}, function(error) {
console.log(error); //optional
return sequence;//skip-over-error. To stop-on-error, `return error` (jQuery), or `throw error` (Promises/A+).
});
}, Q()).then(function() {
// all done.
});
};
नोट: केवल वही एक टुकड़ा, जो Q()
Q के लिए विशिष्ट है। jQuery के लिए आपको यह सुनिश्चित करने की आवश्यकता है कि readFile () एक jQuery वादा लौटाता है। A + lib के साथ, विदेशी वादों को आत्मसात किया जाएगा।
यहां कुंजी कटौती का sequence
वादा है, जो वादों से निपटने का अनुक्रम बनाती है, readFile
लेकिन उनके निर्माण का नहीं।
और एक बार जब आप इसे अवशोषित कर लेते हैं, तो शायद यह थोड़ा दिमाग उड़ाने वाला होता है जब आपको पता चलता है कि .map()
मंच वास्तव में आवश्यक नहीं है! संपूर्ण कार्य, समानांतर कॉल प्लस सीरियल हैंडलिंग सही क्रम में, reduce()
अकेले के साथ प्राप्त किया जा सकता है , और इसके अलावा लचीलेपन का अतिरिक्त लाभ:
- समानांतर async कॉल से धारावाहिक async कॉल में परिवर्तित करके केवल एक पंक्ति को स्थानांतरित करना - संभवतः विकास के दौरान उपयोगी।
यहाँ यह है, Q
फिर से के लिए।
var readFiles = function(files) {
return files.reduce(function(sequence, f) {
var filePromise = readFile(f);//Make calls in parallel. To call sequentially, move this line down one.
return sequence.then(function() {
return filePromise;
}).then(function(file) {
//Do stuff with file ... in the correct sequence!
}, function(error) {
console.log(error); //optional
return sequence;//Skip over any errors. To stop-on-error, `return error` (jQuery), or `throw error` (Promises/A+).
});
}, Q()).then(function() {
// all done.
});
};
यही मूल पैटर्न है। यदि आप कॉल करने वाले को भी डेटा वितरित करना चाहते हैं (जैसे फाइलें या उनमें से कुछ परिवर्तन), तो आपको एक हल्के संस्करण की आवश्यकता होगी।