wait-for-decorator

0.1.9 • Public • Published

wait-for-decorator

Decorate a class method to return and wait on a Promise on the class instance before executing

Made with ❤ at @outlandish

npm version CI build status js-standard-style

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!

Package Sidebar

Install

npm i wait-for-decorator

Weekly Downloads

10

Version

0.1.9

License

MIT

Last publish

Collaborators

  • sdgluck