es6-async

1.0.2 • Public • Published

es6-async Build Status NPM version

Async/Await for ES6 with Generators and Promises

Implements async/await for ES6 (specifically for Node 6.x which is the current Node versions on the three big FaaS providers: AWS Lambda, Google Cloud Functions and Azure Functions).

See Async/Await with Generators and Promises for a blog post about this project.

Install

Using npm:

$ npm install es6-async

In Node.js:

const makeAsync = require('es6-async')

Usage

Write code the same way you write code with async/await with the difference to use makeAsync instead of the async keyword and replace await with yield. Also note that makeAsync takes a generator defined with the function* syntax.

const makeAsync = require('es6-async')
 
const timeout = (milliseconds) => new Promise(resolve => setTimeout(resolve, milliseconds))
const random = () => Promise.resolve(Math.random())
 
const asyncFunc = makeAsync(function* () {
  yield timeout(1000)
  return yield random()
})
 
asyncFunc().then(v => console.log('Finished', v))

The same code written using async/await:

async function asyncFunc() {
  await timeout(1000)
  return await random()
}
 
asyncFunc().then(v => console.log('Finished', v))

Caveat

I've found one small difference that needs to be pointed out:

const resultGen = yield Promise.resolve(100) + 100
const resultAsync = await Promise.resolve(100) + 100
// resultGen = "[object Promise]100"
// resultAsync = 200

In the case of yield, Javascript first evaluates Promise.resolve(100) + 100 which it does by converting both to strings and then sends that to yield. The solution to this is to wrap it in parenthesis.

const resultGen = (yield Promise.resolve(100)) + 100
// resultGen = 200

Using with Google Cloud Functions

const makeAsync = require('es6-async')
 
const timeout = (milliseconds) => new Promise(resolve => setTimeout(resolve, milliseconds))
const random = () => Promise.resolve(Math.random())
 
const asyncFunc = makeAsync(function* () {
  yield timeout(1000)
  return yield random()
})
 
module.exports.randomGen = makeAsync(function*(req, res) {
  res.status(200).send('Random value is: ' + (yield asyncFunc()))
})

Readme

Keywords

Package Sidebar

Install

npm i es6-async

Weekly Downloads

1

Version

1.0.2

License

MIT

Unpacked Size

8.6 kB

Total Files

8

Last publish

Collaborators

  • hallski