2015-05-25 14 views
5

में मूल जेएस वादा निष्पादित करें मुझे प्रत्येक आइटम के लिए कुछ एसिंक कार्य के लिए एक वादा कॉल करना है, लेकिन मैं इन क्रमिक रूप से निष्पादित करना चाहता हूं।श्रृंखला

Promise.all केवल एक नया वादा करने के लिए उपयोगी है जो वादे की एक सूची विलीन करता है लेकिन यह उन्हें अनुक्रम में नहीं बुलाता है।

मैं क्यू, Bluebird की तरह तीसरे पक्ष के पुस्तकालयों के बिना इस का उपयोग कर मानक वादा एपीआई कैसे प्राप्त कर सकते ....

+0

क्यों Promise.all कार्य को पूरा नहीं करता है? – elclanrs

+1

@tarini [इस लेख] पर एक नज़र डालें (http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html)। विशेष रूप से "उन्नत गलती # 3: वादे बनाम वादे कारखानों" खंड में। –

उत्तर

15

आप श्रृंखला एक कॉलबैक है कि एक और वादा रिटर्न के साथ .then() का उपयोग कर वादा करता है। तो, मान लें कि आपके पास तीन कार्य ए, बी और सी हैं जो सभी एक वादा वापस करते हैं। आप उन्हें (अनुक्रम में निष्पादित) श्रृंखला कर सकते हैं इस तरह:

a().then(b).then(c).then(function(result) { 
    // all are done here 
}); 

आप एक सरणी कार्रवाई कर रहे हैं और आप एक वादा-लौटने समारोह myFunc कि आप सरणी में प्रत्येक आइटम के लिए कॉल करना चाहते है, तो आप एक का उपयोग कर सकते .reduce() साथ सरणियों और वादों के लिए मानक डिजाइन पैटर्न इस तरह एक बार में सरणी एक आइटम के माध्यम से चलने के लिए:

var items = [...]; 

items.reduce(function(p, item) { 
    return p.then(function() { 
     return myFunc(item); 
    }); 
}, Promise.resolve()); 

यह पता चला है के रूप में यह वास्तव में सिर्फ पहला उदाहरण की तरह .then() संचालकों का एक समूह चेनिंग है, लेकिन आपके लिए सरणी चलने के लिए .reduce() की संरचना का उपयोग करना।

+0

'.reduce()' के साथ एक सरणी चलकर अनुक्रमित अनुक्रमों का एक उदाहरण जोड़ा गया। – jfriend00

+0

डिजाइन अभ्यास को कम करना बहुत अच्छा है! धन्यवाद! –

संबंधित मुद्दे