Ich schreibe einen Code für Abfragen für eine Ressource alle N ms, die nach M Sekunden Timeout sollte. Ich möchte, dass das Ganze mit Bluebird so viel wie möglich verspricht. Die Lösung, die ich bisher entwickelt habe, verwendet das Intervall des Knotens, die abrechenbaren Bluebird-Versprechungen und die Timeout-Funktion von Bluebird.Was ist ein gutes Muster für "Intervall mit Timeout" mit Promises
Ich frage mich, ob es eine bessere Möglichkeit gibt, Timing-Out-Intervalle mit Bluebird und Versprechungen im Allgemeinen zu tun? Hauptsächlich, indem sichergestellt wird, dass das Intervall an der Stelle aufhört und niemals unendlich weitergeht.
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);
});
Ausgang:
Polling...
Polling...
Polling...
Polling...
poll error: TimeoutError
Result: timed out
Schön. Wie würdest du das Intervall abschließen? Sieht wie der einzige Ausweg aus, wenn man einen Fehler wirft. Ich weiß, dass der Promise-Konstruktor ein Anti-Pattern ist, aber in diesem Fall schien es zu passen (dasselbe gilt für Events + Promises, aber das ist ein anderes Thema). – Chris911
Ok jetzt verstehe ich deine Frage. Überprüfen Sie meine Bearbeitung. – vinayr
Ja, das funktioniert. Danke und akzeptierte Antwort. – Chris911