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.