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\$
8
  • \$\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\$ Commented Aug 20, 2014 at 14:34
  • 2
    \$\begingroup\$ At the moment I don't think we need a node-mysql.js tag here \$\endgroup\$ Commented Aug 20, 2014 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\$ Commented Aug 20, 2014 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\$ Commented Aug 20, 2014 at 14:41
  • \$\begingroup\$ What exactly is the question @WaldoJeffers? Short and simple, because this is a pretty unclear question. \$\endgroup\$ Commented Aug 20, 2014 at 14:55

1 Answer 1

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
  • 1
    \$\begingroup\$ Thanks @konijn. I'll wait a bit to see if someone comes with another answer, and will accept yours otherwise. \$\endgroup\$ Commented Aug 25, 2014 at 8:43

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.