user3284007
user3284007

Reputation: 1717

Processing a method synchronously in Node.js

I've inherited some Node.js code and I need to add some functionality. However, I'm not sure syntactically how to accomplish my goal due to the asynchronous nature of Node. Currently, I have a function defined like this:

return {
  myEntryPoint: function(req, res) {
    var results = getResults();
    res.send(200, results);
  }
};

Several pieces are calling this function already. Inside of it, I'm calling a function called getResults which is defined like this:

var getResults = function() {
  var results = [];
  async.series([
    function(callback) {
      // add to results
    },

    function(callback) {
      // add to results
    }
  ]);

  return results;
};

My problem is, I need to wait until all of the functions inside of the async.series call are made before I return the results. How do I do this?

Upvotes: 0

Views: 58

Answers (2)

MobA11y
MobA11y

Reputation: 18900

The usual way to handle this is to take a callback that uses the argument in question.

results = getResults(args);
someFunction(results);

Is equivalent to

function getResults(args, callback) {
    var results;
    //do stuff and populate results.
    callback(results);
}
getResults(args, someFunction);

Except you don't have the issue of trying to wait for async stuff to happen, which you can't do, without weird logic.

Upvotes: 0

Ben Fortune
Ben Fortune

Reputation: 32127

You could change it to add a callback. Series has an optional callback to run once all the functions have completed within.

var getResults = function(finished) {
    var results = [];
    async.series([
        function(callback) {
            // add to results
        },

        function(callback) {
            // add to results
        }
    ], function() {
        //Called when series is finished
        finished(results);
    });
};

And to get the results,

return {
    myEntryPoint: function(req, res) {
        getResults(function(results) {
            res.send(200, results);
        });
    }
};

Upvotes: 1

Related Questions