Piszę kod do wykonania pollingu dla zasobu co N ms, który powinien upłynąć po M sekundach. Chcę, żeby cała ta obietnica opierała się na Bluebirdie tak bardzo, jak to możliwe. Rozwiązanie, do którego do tej pory doszedłem, wykorzystuje interwał węzła, anulowane obietnice Bluebirda i funkcję limitu czasu bluebirda.Co to jest dobry wzorzec dla "interwału z przekroczeniem czasu" przy użyciu Promises
Zastanawiam się, czy istnieje lepszy sposób na ograniczenie interwałów z bluebirdem i obietnicami w ogóle? Głównie upewniając się, że interwał zatrzymuje się w punkcie i nigdy nie trwa w nieskończoność.
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);
});
wyjściowa:
Polling...
Polling...
Polling...
Polling...
poll error: TimeoutError
Result: timed out
Nice. Jak zakończyłbyś interwał? Wygląda na jedyne wyjście, jeśli rzucisz błąd. Wiem, że konstruktor Promise to anty-wzór, ale w tym przypadku wydawało się, że pasuje (to samo z wydarzeniami + obietnicami, ale to inny temat). – Chris911
Ok teraz rozumiem twoje pytanie. Sprawdź moją edycję. – vinayr
Tak, to działa. Dziękuję i przyjąłem odpowiedź. – Chris911