का उपयोग करके "टाइमआउट के साथ अंतराल" के लिए एक अच्छा पैटर्न क्या है। मैं प्रत्येक एन एमएस के संसाधन के लिए मतदान करने के लिए कुछ कोड लिख रहा हूं जो एम सेकंड के बाद टाइमआउट होना चाहिए। मैं पूरी बात को ब्लूबर्ड का उपयोग करके जितना संभव हो सके वादा करना चाहता हूं। समाधान जो मैंने अभी तक किया है, नोड के अंतराल, रद्द करने योग्य ब्लूबर्ड वादे और ब्लूबर्ड के टाइमआउट फ़ंक्शन का उपयोग करता है।वादा
मुझे आश्चर्य है कि क्या ब्लूबर्ड के साथ अंतराल को समाप्त करने और सामान्य रूप से वादे करने का बेहतर तरीका है? ज्यादातर यह सुनिश्चित करके कि अंतराल बिंदु पर बंद हो जाता है और कभी भी अनिश्चित काल तक नहीं चलता है।
var Promise = require('bluebird');
function poll() {
var interval;
return new Promise(function(resolve, reject) {
// This interval never resolves. Actual implementation could resolve.
interval = setInterval(function() {
console.log('Polling...')
}, 1000).unref();
})
.cancellable()
.catch(function(e) {
console.log('poll error:', e.name);
clearInterval(interval);
// Bubble up error
throw e;
});
}
function pollOrTimeout() {
return poll()
.then(function() {
return Promise.resolve('finished');
})
.timeout(5000)
.catch(Promise.TimeoutError, function(e) {
return Promise.resolve('timed out');
})
.catch(function(e) {
console.log('Got some other error');
throw e;
});
}
return pollOrTimeout()
.then(function(result) {
console.log('Result:', result);
});
आउटपुट:
Polling...
Polling...
Polling...
Polling...
poll error: TimeoutError
Result: timed out
अच्छा। आप अंतराल कैसे पूरा करेंगे? एक त्रुटि फेंकने का एकमात्र तरीका लगता है। मुझे पता है कि वादा कन्स्ट्रक्टर एक विरोधी पैटर्न है लेकिन इस मामले में यह फिट लग रहा था (घटनाओं + वादे के साथ ही यह एक और विषय है)। – Chris911
ठीक है अब मैं आपका प्रश्न समझता हूं। मेरा संपादन जांचें। – vinayr
हाँ जो काम करता है। धन्यवाद और स्वीकार्य उत्तर। – Chris911