Slobodan Blazeski,
As others have said, the idiomatic way to do this in node is to use the
async library and to have callback functions that take an error ("err") as
the first argument.
The reason why it's important to have each asynchronous function pass an
error object to your callback is because it is impossible for the
asynchronous operation to throw an error in such a way that your callback
function can catch it, like you can with traditional, synchronous
programming. For instance, if there is a database error or a calculation
error, you probably want to short-circuit and display the error.
So, with your example modified to include error handling, it would look
like this:
Object1.retrieveNum1Async(function(err, num1){
if (err) throw err;
Object2.retrieveNum2Async(function(err, num2){
if (err) throw err;
Object3.retrieveNum3Async(function(err, num3){
if (err) throw err;
var result = (num1 + num2) / num3;
});
});
});
You may not want to throw the error -- you may want to write it to the
console or ignore it or pass it back to a caller further up the chain --
but in any case you'll want to do *something* with it and you'll probably
want to short-circuit the operation at whatever point the error occurs.
Handling errors at each level like this adds a lot of noise, so typically
node developers turn to the async library, which allows you to consolidate
error handling and callbacks by short-circuiting by default and calling a
single callback with any errors from any of the async calls:
var async = require('async');
async.parallel({
'num1': Object1.retrieveNum1Async.bind(Object1),
'num2': Object2.retrieveNum2Async.bind(Object2),
'num3': Object3.retrieveNum3Async.bind(Object3)
}, function(err, r) {
var result = (r.num1 + r.num2) / r.num3;
});
One annoyance with this approach is the need to .bind() the methods to
their respective objects because passing a method in Javascript effectively
"disembodies" it from the object it was attached to. One way around this is
to pass anonymous functions to async, as James Basco demonstrated above --
this way you're passing anonymous functions to async and you're able to run
the methods right off of their corresponding objects.
Or, if you have the option, it can often be simpler and cleaner to write
callback-heavy code by using closures and nested functions to maintain
state, rather than the more traditional object-oriented style, due to the
need to constantly bind methods. These two styles (object-oriented and
closure-based) can be mixed and matched for optimum simplicity.
--
--
Job Board: http://jobs.nodejs.org/
Posting guidelines:
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en
---
You received this message because you are subscribed to the Google Groups
"nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.