2014-06-17 10 views
6

के साथ वादे के गतिशील अनुक्रम को तोड़ दो मुझे कई वादे (पी 1, पी 2, ... पीएन) मिला है, मैं उन्हें अनुक्रम में श्रृंखला बनाना चाहता हूं (इसलिए Q.all एक विकल्प नहीं है) और मैं चाहता था पहली त्रुटि पर श्रृंखला तोड़ना पसंद है।
प्रत्येक वादा अपने स्वयं के मानकों के साथ आता है।
और मैं त्रुटि को डंप करने के लिए हर वादा त्रुटि को अवरुद्ध करना चाहता हूं।क्यू

यदि पी 1, पी 2, .. पीएन मेरे वादे हैं, तो मेरे पास अनुक्रम स्वचालित करने के लिए कोई सुराग नहीं है।

उत्तर

3

यदि आपके पास वादे की एक श्रृंखला है, तो वे सभी पहले ही शुरू हो चुके हैं और उनमें से कोई भी शुरू करने या रोकने के लिए आप कुछ भी नहीं कर सकते हैं (आप रद्द कर सकते हैं, लेकिन यह वही है जहां तक ​​यह जाता है)।

var promises = /* where you get them, assuming array */; 
// reduce the promise function into a single chain 
var result = promises.reduce(function(accum, cur){ 
    return accum.then(cur); // pass the next function as the `.then` handler, 
        // it will accept as its parameter the last one's return value 
}, Q()); // use an empty resolved promise for an initial value 

result.then(function(res){ 
    // all of the promises fulfilled, res contains the aggregated return value 
}).catch(function(err){ 
    // one of the promises failed, 
    //this will be called with err being the _first_ error like you requested 
}); 

तो, कम एनोटेट संस्करण:

var res = promises.reduce(function(accum,cur){ return accum.then(cur); },Q()); 

res.then(function(res){ 
    // handle success 
}).catch(function(err){ 
    // handle failure 
}); 
+0

धन्यवाद

मान लिया जाये कि आप F1,... Fnवादा लौटने कार्यों है, तो आप वादे के मूल निर्माण खंड, इस के लिए हमारे .then उपयोग कर सकते हैं ! हालांकि, मुझे लगता है कि आखिरी "फिर" में एक तर्क के रूप में पारित "समेकित परिणाम" कुछ है जो मुझे अपनी सुविधा के अनुसार खुद को लागू करना चाहिए? – Guid

+1

@ गुइड यह आपके एपीआई पर निर्भर करता है, मुझे लगता है कि प्रत्येक वादे को पिछले एक के परिणाम की आवश्यकता होती है (क्योंकि आपने उन्हें अनुक्रम में पूछा था)। उदाहरण के लिए आप - एक सरणी बना सकते हैं और लूप में 'पुश' ('वापसी accum.then (cur);') भाग से पहले, और फिर परिणामों को 'पीछे हटाना' से पहले। –

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