I am trying to understand how to design node.js applications, but it seems there is something I can't grasp about asynchronous programming.
Let's say my application needs to access a database. In a synchronous environment I would implement a data access class with a read() method, returning an associative array.
In node.js, because code is executed asynchronously, this method can't return a value, so, after execution, it will have to "do" something as a side effect. It will then contain some code which does something else than just reading data.
Let's suppose I want to call this method multiple times, each time with a different success callback. Since the callback is included in the method itself, I can't find a clean way to do this without either duplicating the method or specifying all possible callbacks in a long switch statement.
What is the proper way to handle this problem? Am I approaching it the wrong way?
-
2It is not very clear what is your problem, maybe rephrase it. I'd have two comments: 1. Maybe you just need to get used to async/callback way of doing things, I do not see anything like "unmanageable code soup" there. 2. Ad "loosely coupled classes": do you really need "classes" there? Classes are not needed to do OO neither to do good design. Maybe change the title.herby– herby2012年09月04日 18:18:30 +00:00Commented Sep 4, 2012 at 18:18
-
I'm not certain what this code soup is either?Jimmy Hoffa– Jimmy Hoffa2012年09月04日 20:58:41 +00:00Commented Sep 4, 2012 at 20:58
-
I changed the title and rephrased the question. I hope it is clearer now.lortabac– lortabac2012年09月05日 06:37:29 +00:00Commented Sep 5, 2012 at 6:37
1 Answer 1
Since you can pass functions as parameters, it is common to pass a "callback" function to these sorts of functions. So, for example, you may have a "read" function that looks like this:
function getUser(userId, callback) {
var mydbAPI = something;
var myQuery = somethingElse;
mydbAPI.getUser(myQuery, function(data) {
//parse data a little here:
myParsedData = ...;
callback(myParsedData);
});
}
You can then call the read method like this:
getUser(userId, function(parsedData) {
//...do something with parsedData
});