दिलचस्प पोस्ट
एंड्रॉइड: मीडियाप्लेयर सेटवॉल्यूम फ़ंक्शन एसोसिएशन टेबल में अतिरिक्त फ़ील्ड के साथ पहले, बहुत से कई कोड बनाएं फॉर्म पर जावास्क्रिप्ट पोस्ट सबमिट करें एक नई विंडो बाश के समय में एसयूएस टूट जाता है .NET obfuscation उपकरण / रणनीति पायथन कैसे एक रीडायरेक्ट के लिए बनाई गई नई लाइन के साथ एक TXT फ़ाइल में प्रिंट का आउटपुट रीडायरेक्ट करें पॉको बनाम डीटीओ मैं UICollectionViewCell पर मानक चेकमार्क कैसे दिखाऊँ? मैं PHP में HTML को गूंज कैसे कर सकता हूं? यदि ऑपरेटर के बराबर काम नहीं करता है, तो यह अंतरिक्ष से घिरा नहीं है? क्या जावा में एक गोटो स्टेटमेंट है? कोणीय जेएस – हैडर डिफ़ॉल्ट पर सेट टोकन जब मॉडल पहले से मौजूद है, तो `रेल को स्कैफोल्ड बनाने 'को चलाने के लिए कैसे? Value <br का प्रकार java.lang.String को Android पर JSONObject में परिवर्तित नहीं किया जा सकता Base64 के साथ एक छवि फ़ाइल एन्कोडिंग

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

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

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

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

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

धन्यवाद

Solutions Collecting From Web of "जबकि ब्लूबर्ड वादों का इस्तेमाल करते हुए लूप"

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; })