स्पष्ट पास से गुजरना
कॉलबैक के घोंसले के समान, यह तकनीक क्लोजर पर निर्भर करती है। फिर भी, श्रृंखला सपाट रहती है - केवल नवीनतम परिणाम पारित करने के बजाय, प्रत्येक चरण के लिए कुछ राज्य वस्तु पारित की जाती है। ये राज्य ऑब्जेक्ट पिछले कार्यों के परिणामों को जमा करते हैं, उन सभी मूल्यों को सौंपते हैं जिन्हें बाद में फिर से और वर्तमान कार्य के परिणाम की आवश्यकता होगी।
function getExample() {
return promiseA(…).then(function(resultA) {
// some processing
return promiseB(…).then(b => [resultA, b]); // function(b) { return [resultA, b] }
}).then(function([resultA, resultB]) {
// more processing
return // something using both resultA and resultB
});
}
यहां, वह छोटा तीर b => [resultA, b]
वह फ़ंक्शन है जो बंद हो जाता है resultA
, और अगले चरण में दोनों परिणामों की एक सरणी पास करता है। जो एकल चरों में इसे तोड़ने के लिए पैरामीटर डिस्ट्रक्टिंग सिंटैक्स का उपयोग करता है।
ईएस 6 के साथ विनाशकारी उपलब्ध होने से पहले, एक निफ्टी हेल्पर विधि कहा जाता है जिसे .spread()
कई वाद पुस्तकालयों ( क्यू , ब्लूबर्ड , कब ,…) द्वारा प्रदान किया गया था । यह कई मापदंडों के साथ एक फ़ंक्शन लेता है - प्रत्येक सरणी तत्व के लिए - जैसा कि उपयोग किया जाना है .spread(function(resultA, resultB) { …
।
बेशक, यहाँ आवश्यक बंद करने को आगे कुछ सहायक कार्यों द्वारा सरल किया जा सकता है, जैसे
function addTo(x) {
// imagine complex `arguments` fiddling or anything that helps usability
// but you get the idea with this simple one:
return res => [x, res];
}
…
return promiseB(…).then(addTo(resultA));
वैकल्पिक रूप से, आप Promise.all
सरणी के लिए वादे का उत्पादन करने के लिए नियोजित कर सकते हैं :
function getExample() {
return promiseA(…).then(function(resultA) {
// some processing
return Promise.all([resultA, promiseB(…)]); // resultA will implicitly be wrapped
// as if passed to Promise.resolve()
}).then(function([resultA, resultB]) {
// more processing
return // something using both resultA and resultB
});
}
और आप न केवल सरणियों का उपयोग कर सकते हैं, बल्कि मनमाने ढंग से जटिल वस्तुओं का उपयोग कर सकते हैं। उदाहरण के लिए, एक अलग सहायक समारोह में _.extend
या उसके साथ Object.assign
:
function augment(obj, name) {
return function (res) { var r = Object.assign({}, obj); r[name] = res; return r; };
}
function getExample() {
return promiseA(…).then(function(resultA) {
// some processing
return promiseB(…).then(augment({resultA}, "resultB"));
}).then(function(obj) {
// more processing
return // something using both obj.resultA and obj.resultB
});
}
हालांकि यह पैटर्न एक सपाट श्रृंखला की गारंटी देता है और स्पष्ट राज्य ऑब्जेक्ट स्पष्टता में सुधार कर सकते हैं, यह एक लंबी श्रृंखला के लिए थकाऊ हो जाएगा। विशेष रूप से जब आपको केवल छिटपुट रूप से राज्य की आवश्यकता होती है, तो आपको अभी भी इसे हर चरण से गुजरना होगा। इस निश्चित इंटरफ़ेस के साथ, श्रृंखला में एकल कॉलबैक बल्कि कसकर युग्मित और बदलने के लिए अनम्य हैं। यह एकल चरण को कठिन बनाता है, और कॉलबैक को अन्य मॉड्यूल से सीधे आपूर्ति नहीं की जा सकती है - उन्हें हमेशा बॉयलरप्लेट कोड में लपेटने की आवश्यकता होती है जो राज्य के बारे में परवाह करता है। उपरोक्त की तरह सार सहायक कार्य दर्द को थोड़ा कम कर सकते हैं, लेकिन यह हमेशा मौजूद रहेगा।
javascript
, यह अन्य भाषा में प्रासंगिक है। मैं सिर्फ जावा और jdeferred में "चेन को तोड़ने" के जवाब का उपयोग करता हूं