Sto scrivendo del codice per eseguire il polling per una risorsa ogni N ms che dovrebbe scadere dopo M secondi. Voglio che tutto sia promesso basandomi il più possibile su Bluebird. La soluzione che ho trovato finora utilizza l'intervallo del nodo, le promesse bluebird cancellabili e la funzione di timeout di bluebird.Che cosa è un buon modello per "intervallo con timeout" utilizzando Promises
Mi chiedo se c'è un modo migliore per programmare gli intervalli con bluebird e promesse in generale? Principalmente assicurandosi che l'intervallo si fermi al punto e non continui mai indefinitamente.
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);
});
uscita:
Polling...
Polling...
Polling...
Polling...
poll error: TimeoutError
Result: timed out
Nice. Come completeresti l'intervallo? Sembra l'unica via d'uscita se si genera un errore. So che il costruttore Promise è un anti-pattern, ma in questo caso sembrava adattarsi (lo stesso vale per gli eventi + Promises ma questo è un altro argomento). – Chris911
Ok ora capisco la tua domanda. Controlla la mia modifica. – vinayr
Sì, questo funziona. Grazie e risposta accettata. – Chris911