दिलचस्प पोस्ट
गैर अवरुद्ध subprocess.call प्रोग्रामर एंड्रॉइड फोन के फोन नंबर प्राप्त करें चल रहे संगीतकार देता है: "इनपुट फ़ाइल नहीं खोला जा सकता: composer.phar" Jquery Ajax छवि लोड हो रहा है सभी खुली खिड़कियों के शीर्षक प्राप्त करें पैरामॉरफीम्स क्या हैं? "डाउनकास्टिंग" अनूठी_प्रतिक <बेस> को अनूठे_पीट <डिलीवर> क्या आर में बोली-जैसी ऑपरेटर हैं जैसे कि पर्ल के qw ()? स्प्रिंग डी – एवरवायर की गई संपत्ति एक रिक सेवा में शून्य है स्ट्रिंग के लिए Linq int कैसे PHP में एक निर्देशिका ज़िप? mysql, कॉलम के नामों के माध्यम से दोहराएं PHP का उपयोग करने के लिए इनपुट फ़ील्ड मान कैसे प्राप्त करें सी # में तुल्यकालिक विधि से अतुल्यकालिक विधि को कैसे कॉल करें? एनजीएन ना-www www और www से नो-www

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

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

यहां उल्लिखित विधि कार्य करने लगता है 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; })