2015-10-12 6 views
41

नोड 4.x का उपयोग करना। जब आपके पास Promise.all(promises).then() है, तो डेटा को हल करने और अगले .then() पर जाने का उचित तरीका क्या है?Promise.all()। फिर() हल करें?

मैं इस तरह कुछ करना चाहता हूँ:

Promise.all(promises).then(function(data){ 
    // Do something with the data here 
}).then(function(data){ 
    // Do more stuff here 
}); 

लेकिन मुझे यकीन है 2 .then() करने के लिए डेटा प्राप्त करने के लिए नहीं कर रहा हूँ। मैं पहले .then() में resolve(...) का उपयोग नहीं कर सकता। मैं पता लगा मैं यह कर सकता:

return Promise.all(promises).then(function(data){ 
    // Do something with the data here 
    return data; 
}).then(function(data){ 
    // Do more stuff here 
}); 

लेकिन वह यह करने के लिए उचित तरीके से ... यह करने के लिए सही दृष्टिकोण क्या है की तरह प्रतीत नहीं होता?

उत्तर

65

लेकिन वह यह करने के लिए उचित तरीके से की तरह प्रतीत नहीं होता ..

वास्तव में यह (या कम से कम यह करने के लिए एक उचित तरीके से) करने के लिए उचित तरीका है। यह वादे का एक प्रमुख पहलू है, वे एक पाइपलाइन हैं, और डेटा पाइपलाइन में विभिन्न हैंडलर द्वारा मालिश किया जा सकता है।

उदाहरण:

const promises = [ 
 
    new Promise(resolve => setTimeout(resolve, 0, 1)), 
 
    new Promise(resolve => setTimeout(resolve, 0, 2)) 
 
]; 
 
Promise.all(promises) 
 
    .then(data => { 
 
    console.log("First handler", data); 
 
    return data.map(entry => entry * 10); 
 
    }) 
 
    .then(data => { 
 
    console.log("Second handler", data); 
 
    });

(। catch हैंडलर संक्षिप्तता के लिए छोड़े गए उत्पादन कोड में, हमेशा या तो वादा प्रचार, या अस्वीकृति संभाल।)

आउटपुट हम उससे देखते हैं:

 
First handler [1,2] 
Second handler [10,20] 

... क्योंकि पहली हैंडलर दो वादों (1 और 2) एक सरणी के रूप में के संकल्प हो जाता है, और फिर 10 से गुणा किया तो उनमें से प्रत्येक के साथ एक नई सरणी बनाता है और यह देता है। दूसरे हैंडलर को पहला हैंडलर वापस लौटा देता है।

अतिरिक्त कार्य आप कर रहे हैं तुल्यकालिक है, तो आप भी यह में पहली हैंडलर रख सकते हैं:

उदाहरण:

const promises = [ 
 
    new Promise(resolve => setTimeout(resolve, 0, 1)), 
 
    new Promise(resolve => setTimeout(resolve, 0, 2)) 
 
]; 
 
Promise.all(promises) 
 
    .then(data => { 
 
    console.log("Initial data", data); 
 
    data = data.map(entry => entry * 10); 
 
    console.log("Updated data", data); 
 
    return data; 
 
    });

... लेकिन यदि यह अतुल्यकालिक है तो आप ऐसा नहीं करना चाहेंगे क्योंकि यह घोंसला प्राप्त हो जाता है, और घोंसले जल्दी से हाथ से बाहर निकल सकते हैं।

+1

दिलचस्प। धन्यवाद। तो शुरुआती 'वादा' समारोह के बाद मूल्य को अस्वीकार करना संभव नहीं है? या श्रृंखला में कहीं भी एक त्रुटि फेंकने से आपको '.catch() 'पर ले जाया जाएगा? यदि ऐसा है, तो पहले स्थान पर 'अस्वीकार' का क्या मतलब है? क्यों न सिर्फ त्रुटि फेंक? धन्यवाद, –

+3

@ जेक विल्सन: वे अलग-अलग प्रश्न हैं। लेकिन आप दो अलग-अलग चीजों को भ्रमित कर रहे हैं: * बनाना * और वचन को सुलझाना, और * वचन * को संभालना। जब आप वादे बना रहे हैं और निपटारे कर रहे हैं, तो आप 'हल करें' और 'अस्वीकार' का उपयोग करते हैं। जब आप * हैंडलिंग * कर रहे हैं, यदि आपकी प्रसंस्करण विफल हो जाती है, तो आप विफलता पथ को ट्रिगर करने के लिए वास्तव में अपवाद फेंक देते हैं।और हां, आप मूल 'वादा' कॉलबैक ('अस्वीकार' का उपयोग करने के बजाय) से अपवाद भी फेंक सकते हैं, लेकिन सभी विफलताओं अपवाद नहीं हैं। –

+0

अच्छी तरह से समझाया। फिर से धन्यवाद –

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