4
\$\begingroup\$

I am using

  • Node.js
  • Express.js
  • node-mysql.js
  • async.js

I am making multiple asynchronous queries to my DB, but every query relies on the previous one's results, so I decided to use the waterfall method.

Right now, my code looks like this (I simplified it with only 2 queries, but there are more):

async.waterfall([
    function(cb){
        db.query(insertQuery,values,cb);
    },
    function(results,_,cb){
       var lastInsertId = results.insertId;
       db.query(anotherInsertQuery,otherValues.concat(lastInsertId),cb);
    }
],callback);

But I found my code a bit messy, especially the function(cb) { ... } wraps.

Is there a way to get rid of those annoying function(cb){...} ?

\$\endgroup\$
  • \$\begingroup\$ @Jamal : Thanks for the edit. I wanted to tag my post with node-mysql.js, since it's related with that, but I couldn't create it (not enough reputation). Do you think you could do that ? \$\endgroup\$ – Waldo Jeffers Aug 20 '14 at 14:34
  • 2
    \$\begingroup\$ At the moment I don't think we need a node-mysql.js tag here \$\endgroup\$ – Simon Forsberg Aug 20 '14 at 14:36
  • \$\begingroup\$ Welcome to Code Review btw, I don't find your question very clear. Are you asking if your implementation is good, or asking for alternative implementations? \$\endgroup\$ – Simon Forsberg Aug 20 '14 at 14:36
  • \$\begingroup\$ @SimonAndréForsberg : Ok I understand. I first hesitated, because I thought it was too specific, but then found out that async.js existed, with only one question so... But anyway, thanks for the welcome ! Sorry about that, I would like to know what's the cleanest way to do what I'm trying to do using the async.js module. What methods (apply, waterfall...) or structure should I use ? Is that more clear ? Do you think I should edit my question ? \$\endgroup\$ – Waldo Jeffers Aug 20 '14 at 14:41
  • \$\begingroup\$ What exactly is the question @WaldoJeffers? Short and simple, because this is a pretty unclear question. \$\endgroup\$ – RubberDuck Aug 20 '14 at 14:55
1
\$\begingroup\$

I think not.

Whereas you find the function(cb) { ... } wraps a bit messy, I think that this is the most elegant way to show readers that this is a separate functions, and that stuff is about to get asynchronous.. Again, compared to other approaches, this is quite clean.

Also, (I know this is just a small example), consider not using the lastInsertId variable. You could simply go for

async.waterfall([
    function(cb){
        db.query(insertQuery,values,cb);
    },
    function(results,_,cb){
       db.query(anotherInsertQuery,otherValues.concat(results.insertId),cb);
    }
],callback);
\$\endgroup\$
  • 1
    \$\begingroup\$ Thanks @konijn. I'll wait a bit to see if someone comes with another answer, and will accept yours otherwise. \$\endgroup\$ – Waldo Jeffers Aug 25 '14 at 8:43

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.