await.js

Node's await implement powered by v8's generator

Usage no npm install needed!

<script type="module">
  import awaitJs from 'https://cdn.skypack.dev/await.js';
</script>

README

await.js

Invoke asynchronous functions in a synchronous way, so you can get rid of the callback hell.
Thanks to Node's new feature "generator", it is light-weight and pure JavaScript;)

Installation

npm install await.js

Usage Patterns

First, as it usually goes:

var await = require('await.js');

Then You need to wrap your code as a function with two paramters await and defer, which should be marked with * to tell Node this is a generator.
Pass the function to await.async

await.async(function* (await, defer) {
  
});

Inside the generator we can call asynchronous functions as if it's synchronous. Here we give a example of fs.readFile to show you how to do it.
Pass defer as a callback to the asynchronous function you want to invoke.

fs.readFile('textFile', defer)

Add a yield just before the invoke and wrap them all into await, which will magically return the callback result.

var fileContent = await(yield fs.readFile('textFile', defer));

yield is necessary because it is what enables us to pause the current flow and wait for the asynchronous invoke returning its result.

Exceptions

Error will be automatically thrown if any. So feel relax to use try/catch:

  try {
    var data = await(yield fs.readFile("textFile", defer));
    console.log(data.toString());
  }
  catch (e) {
    console.log("Error catched: ", e.toString());
  }

The missing sleep function for Node

yield await(5000);//sleep for 5 seconds

It just works;)

Attention

  • Generator is only available in Node v0.11, so the devel version of Node is required and you need to pass the --harmony flag through to Node to make await.js work. Just don't worry about it as the stable release supporting generator on its way.
  • It is assumed that the callback function receives two arguments, the first as a error and the second as the result. So if there are multiple results you can only get the first one.

License

Do What the Fuck You Want to