Question

I am developing application in Node.js with ExpressJS. I am new to event-driven development and I have a basic question about event-driven architecture and visibility.

I have a service which needs to make several MySQL queries and return them as one JSON object. Something like this:

exports.someService = function(..) {
  mysql.query("some select", function(rows...) {
   // here I want to store the rows in a way to be visible from parent function
  });

  mysql.query("some other select where id=some value from previous select", function(rows...) {
    res.send(rows from this query + rows from previous query)
  });  
}

How can I do this?

Was it helpful?

Solution

If you want to use the result of a callback you'll have to place the code that uses the result within the callback itself.

So your example would become:

exports.someService = function(..) {
   mysql.query("some select", function(rows...) {

      mysql.query("some other select where id=some value from previous select",
        function(rows...) {
         res.send(rows from this query + rows from previous query)
     });  
   });
}

You can clean it up by un-nesting your callbacks and passing them the relevant parameters:

exports.someService = function(..) {
   mysql.query("some select", cb1);
}

function cb1(sql_result_1) {
     mysql.query("some other select where id=some value from previous select",
       function(sql_result2) { cb2(sql_result_1, sql_result2) });
}

function cb2(sql_result_1, sql_result2) {
    res.send(rows from this query + rows from previous query)
}

You have to chain your callbacks together because, in an event based model, code doesn't block.

E.g.,

mysql.query("...", some_cb);
mysql.query("...", some_other_cb);

some_cb and some_other_cb will, conceptually, be run at the same time. This is because Control passes through callbacks instead of in the normal line-by-line method which you are used to.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top