#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());
}
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