wait-for-decorator
Decorate a class method to return and wait on a Promise on the class instance before executing
Made with ❤ at @outlandish
Install
npm install wait-for-decorator --save
Usage
Wait on a single Promise:
@waitFor('promiseName')
Wait on multiple Promises (array):
@waitFor(['promiseName1', 'promiseName2'])
Wait on multiple Promises (arguments):
@waitFor('promiseName1', 'promiseName2')
Requirements
- Node >=4.1.1
- Babel >=5
babel-plugin-transform-decorators-legacy
(Babel 6 only) (npm)
@waitFor
If you have a class that performs some asynchronous operation during initialisation but don't want consumption of its methods to be hindered by forcing their invocation to happen after initialisation is complete, you will do something like this:
class Example {
constructor () {
this.promise = initialise()
}
someMethod () {
// Ensure init is complete internally...
return this.promise.then(() => {
// ...and now actually do the 'someMethod' operation
})
}
anotherMethod () {
return this.promise.then(() => {
// Do 'anotherMethod' operation
})
}
}
Which gets ugly when you have lots of methods implementing this same behaviour. Instead, decorate the method using wait-for-decorator
:
@waitFor('promise')
someMethod () {
// Everything here will run after `this.promise` resolves
}
@waitFor('promise')
anotherMethod () {
// And everything here too!
}
Examples
Wait for single Promise
class Say {
constructor (message) {
this.message = ''
this.timeoutPromise = new Promise((resolve, reject) => {
setTimeout(() => {
this.message = message
resolve()
}, 50)
})
}
@waitFor('timeoutPromise')
sayMessage () {
console.log(this.message)
}
}
const inst = new Say('Hello, World!')
inst.sayMessage() //=> 'Hello, World!'
Wait for multiple Promises
class Say {
constructor (messages) {
this.message = ''
this.firstPromise = new Promise((resolve) => {
setTimeout(() => {
this.message += messages[0]
resolve()
}, 50)
})
this.secondPromise = new Promise((resolve) => {
setTimeout(() => {
this.message += messages[1]
resolve()
}, 100)
})
}
@waitFor(['firstPromise', 'secondPromise'])
sayMessage () {
console.log(this.message)
}
}
const inst = new Say(['Hello, ', 'World!'])
inst.sayMessage() //=> 'Hello, World!'
Contributing
All pull requests and issues welcome!
If you're not sure how, check out Kent C. Dodds' great video tutorials on egghead.io!