Simple library providing Java like wait and notify functionality for async/await syntax.
Works in Node (or browser via Browserify or Webpack) when Promise and async/await syntax are enabled.
Install
npm install --save await-notify
Usage
const { Subject } = require('await-notify');
const event = new Subject();
(async () => {
while (true) {
await event.wait();
console.log('Event occured');
}
})();
setTimeout(() => {
event.notify();
}, 1000);
API reference
Subject
A class representing subjects that could be waited for and notfied on.
Subject.prototype.wait([timeout = Infinity])
Returns a promise that will be resolved either when the subject is been notfied or when timeout occurs.
timeout
parameter is in milliseconds, and no timeout will occur if not set to an finite number greater than 0.
The promise resolves false
if timeout occurs, resolves true
otherwise.
const subject = new Subject();
(async () => {
const notTimeout = await subject.wait();
...
})();
Subject.prototype.notify()
Resolve one waiting session. Does nothing if no one is waiting on this subject.
Return nothing and thus should not be used with await
.
subject.notify();
Subject.prototype.notifyAll()
Similar to notify
but notifies all waiting session.
Tips
Pass data to the waiter when calling notify
There's no fancy way to do this, but a Subject instance is just another plain JavaScript object which you can freely assign parameters to. So you may just do this:
const { Subject } = require('await-notify');
const event = new Subject();
(async () => {
while (true) {
await event.wait();
console.log('Event occured with message:'. event.message);
}
})();
setTimeout(() => {
event.message = 'Hello there';
event.notify();
}, 1000);
Use without async/await
Under the hood, async/await are just sugar syntax for using Promise. So using promise directly is fine.
const { Subject } = require('await-notify');
const event = new Subject();
function listen() {
event.wait().then(() => {
console.log('Event occured');
listen();
});
}
listen();
setTimeout(() => {
event.message = 'Hello there';
event.notify();
}, 1000);