दिलचस्प पोस्ट
रीफ़्रेश टोकन गूगल एपीआई इम्प्मेंट्स बनाम फैलता है: उपयोग करने के लिए कब? क्या फर्क पड़ता है? सी + + स्थिर वर्चुअल सदस्य? जावास्क्रिप्ट (+) चिह्न को वैरिएबल की राशि देने के बजाय सम्मिलित करता है LD_PRELOAD चाल क्या है? जावा में लंबाई और लंबाई () जो तेज़ है: स्टैक आवंटन या हीप आवंटन SQL सर्वर: MAX (DATE) के साथ केवल पंक्तियां चुनें क्या पीएचपी में फाइल या कॉलिंग कोड के सापेक्ष पथ शामिल हैं? जावा धाराओं में वास्तव में केवल डीबगिंग के लिए झांकना है? कैसे जावास्क्रिप्ट वस्तु मान गतिशील रूप से सेट करें? MessageDialog ShowAsync दूसरे संवाद पर एक्सेसडेडेड अपवाद फेंकता है जीवीएम में टैब क्लोज़ बटन को कैसे दिखाना है? Xcode में NSZombie कैसे सक्षम करें? सी # में स्ट्रिंग में "\" के साथ "\" बदलें

जबकि ब्लूबर्ड वादों का इस्तेमाल करते हुए लूप

मैं वादे का उपयोग करते हुए थोड़ी देर लूप को लागू करने की कोशिश कर रहा हूं।

यहां उल्लिखित विधि कार्य करने लगता है http://blog.victorquinn.com/javascript-promise-while-loop यह इस तरह एक समारोह का उपयोग करता है

var Promise = require('bluebird'); var promiseWhile = function(condition, action) { var resolver = Promise.defer(); var loop = function() { if (!condition()) return resolver.resolve(); return Promise.cast(action()) .then(loop) .catch(resolver.reject); }; process.nextTick(loop); return resolver.promise; }; 

ऐसा लगता है कि विरोधी-पैटर्न और नापसंद तरीके जैसे कास्ट और डिफेयर

क्या किसी को यह पूरा करने के लिए एक बेहतर या अधिक आधुनिक तरीके पता है?

धन्यवाद

वेब के समाधान से एकत्रित समाधान "जबकि ब्लूबर्ड वादों का इस्तेमाल करते हुए लूप"

cast को resolve लिए अनुवाद किया जा सकता है defer वास्तव में इस्तेमाल नहीं किया जाना चाहिए।

आप अपने लूप को केवल प्रारंभिक Promise.resolve(undefined) पर चेनिंग और घोंसले के शिकार के माध्यम से बनाते हैं। Promise.resolve(undefined)

 function promiseWhile(predicate, action, value) { return Promise.resolve(value).then(predicate).then(function(condition) { if (condition) return promiseWhile(predicate, action, action()); }); } 

यहां, वाद- predicate और action दोनों में वादे वापस आ सकते हैं समान कार्यान्वयन के लिए वादे के लिए लूप लिखने का सही तरीका भी है । अपने मूल समारोह के करीब होगा

 function promiseWhile(predicate, action) { function loop() { if (!predicate()) return; return Promise.resolve(action()).then(loop); } return Promise.resolve().then(loop); } 

मैं इस कार्यान्वयन को पसंद करता हूं क्योंकि इसके ब्रेक को अनुकरण करना और इसके साथ जारी रखना आसान है:

 var Continue = {}; // empty object serves as unique value var again = _ => Continue; var repeat = fn => Promise.try(fn, again) .then(val => val === Continue && repeat(fn) || val); 

उदाहरण 1: स्टॉप जब स्रोत या गंतव्य एक त्रुटि संकेत मिलता है

 repeat(again => source.read() .then(data => destination.write(data)) .then(again) 

उदाहरण 2: बेतरतीब ढंग से रोकें यदि सिक्का फ्लिप को 0% के साथ 90% की संभावना परिणाम देता है

 var blah = repeat(again => Promise.delay(1000) .then(_ => console.log("Hello")) .then(_ => flipCoin(0.9) && again() || "blah")); 

उदाहरण 3: शर्त के साथ लूप जो योग वापस करता है:

 repeat(again => { if (sum < 100) return fetchValue() .then(val => sum += val) .then(again)); else return sum; })