NEWS
Sleep bei Ereignis unterbrechen
-
Hallo,
ich habe eine Schleife die regelmässig nach Änderungen sucht (Nicht nur in Datenpunkten) und dann für einen Zeitraum schläft.
Das tut sie mit der Funktion
function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms * 1000)); }
auch ganz gut.
Im Script gibts zum schlafenlegen dann passend
await sleep(300);
Nun soll das schlafen aber bei bestimmten Ereignissen per on({id: ... unterbrochen werden.
Bekomme ich das irgendwie hin? -
@warhammer73 sagte in Sleep bei Ereignis unterbrechen:
Bekomme ich das irgendwie hin?
Man könnte noch mit Events arbeiten und wenn das Event gefeuert wird, dann clearTimeout + ebenfalls resolve aufrufen.
-
Beispiel (ungetestet):
const EventEmitter = require('events'); const eventEmitter = new EventEmitter(); async function sleep(ms) { return new Promise(resolve => { const timeout = setTimeout(resolve, ms * 1000); eventEmitter.on('cancel', () => { clearTimeout(timeout); resolve(); }); }); } on({ id: ...}, () => { eventEmitter.emit('cancel'); });
Eventuell wäre es schlauer mit
.once()
und/oder.removeAllListeners()
zu arbeiten. Aber einfach mal rumspielen. Reicht das als Denkanstoß?const EventEmitter = require('events'); const eventEmitter = new EventEmitter(); async function sleep(ms) { return new Promise(resolve => { let timeout = undefined; timeout = setTimeout(() => { timeout = undefined; eventEmitter.removeAllListeners('cancel'); resolve(); }, ms * 1000); eventEmitter.once('cancel', () => { if (timeout) { clearTimeout(timeout); } resolve(); }); }); } on({ id: ...}, () => { eventEmitter.emit('cancel'); });