2015-05-18 6 views
11

को हल और अनदेखा करते हैं मेरे पास कई वादे हैं, प्रत्येक वादा वेबसाइट को स्क्रैप करने का अनुरोध है। उनमें से ज्यादातर हल करते हैं लेकिन ऐसे मामले हो सकते हैं जो एक या दो अस्वीकार करते हैं उदा। वेबसाइट नीचे है। मैं जो चाहता हूं वह अस्वीकार किए गए वादों को अनदेखा करना है और मूल्यों को केवल उन वादों के बारे में रखना है जिन्हें हल किया गया है।मानों को केवल उन वादे से रखें जो अस्वीकार

Promise.all उस मामले के लिए नहीं है क्योंकि इसे हल करने के सभी वादों की आवश्यकता है।

Promise.some() वह नहीं है जो मैं चाहता हूं क्योंकि मुझे पहले से पता नहीं है कि कितने वादे हल होंगे।

Promise.any() गिनती के साथ Promise.some() रूप में ही है 1.

कैसे इस मामले हल किया जा सकता है? मैं Bluebird implementation का उपयोग कर रहा हूं।

+0

अगर आप पाने के लिए एक टाइमआउट जोड़ सकता है, उन्हें अंततः "हल" करना चाहिए। तो मैं सोच रहा हूं कि क्या आप समय-समय पर परीक्षण करना चाहते हैं और देखें कि कितने हल हुए हैं? – Dinesh

+0

@ दिनेश अच्छी तरह से, यह एक विश्वसनीय समाधान नहीं है, अगर ऐसा नहीं होता है, तो 'संसाधन' घंटों तक नीचे है? एक और अधिक विश्वसनीय समाधान होना चाहिए। –

उत्तर

15

ज़रूर बात है, भाग्यशाली आप पहले से ही Bluebird के लिए ऐसा करता है:

Promise.all(arrayOfPromises.map(function(el){ 
    return el.reflect(); 
})).filter(function(p){ 
    return p.isFulfilled(); 
}).then(function(results){ 
    // only fulfilled promises here 
}); 
+0

thx, बसने का काम किया। –

+0

@ बेंजामिन ग्रुनेबाम - इसके साथ समस्या (Promise.reflect()) यह है कि आप उस ब्लॉक में वादे ऑब्जेक्ट की गुणों (जैसे objectname.itsproperty) का उपयोग नहीं कर सकते हैं। –

0

इस @Benjamin समाधान के रूप में, लेकिन और अधिक सुरुचिपूर्ण सरणी के साथ एक ही है:

Promise.settle(arrayOfPromises).then(function(results){ 
    for(var i = 0; i < results.length; i++){ 
     if(results[i].isFulfilled()){ 
      // results[i].value() to get the value 
     } 
    } 
}); 

तुम भी नए reflect कॉल उपयोग कर सकते हैं हेरफेर:

यह कोड अस्वीकृत वादे परिणाम को अनदेखा कर देगा, ताकि आप 10 वादे चला सकें और परिणाम 3 तत्वों के सरणी के रूप में हो:

Promise.settle(arrayOfPromises).then(function(results){ 
    return results.filter(function (result) { 
       return result.isFulfilled(); 
      }).map(function (result) { 
       return result.value(); 
      }); 
}).then(function(results){ 
    console.log("here you go:", results); 
}); 

यहाँ अस्वीकार कर दिया वादा पर ध्यान नहीं देगा, लेकिन परिणाम के रूप में अशक्त स्थापित करेंगे ताकि आप 10 तत्वों की सरणी को अस्वीकार कर दिया मान शून्य हो जाएगा के रूप में परिणाम होगा यदि आप 10 वादों चलाएँ:

Promise.settle(arrayOfPromises).then(function(results){ 
    return results.map(function (result) { 
       return result.isFulfilled()? result.value() : null; 
      }); 
}).then(function(results){ 
    console.log("here you go:", results); 
}); 
संबंधित मुद्दे