Gaurav
Gaurav

Reputation: 788

Synchronize node.js object

I am using a variable and that is used by many functions at a time. I need to synchronize it. How do I do it?

var x = 0;

var a = function(){
  x=x+1;
}

var b = function(){
  x=x+2;
}

var c = function(){
  var t = x;
  return t;
}

This is the simplified logic of my code. To give more insight, X is as good as my mongoDB object which needs to be used by only one function at a time. Also 3 functions are like REST api calls so there is probability they will be called at same time.

I need to write getX function which should manage locking and unlocking.

Any suggestions?

Upvotes: 1

Views: 3540

Answers (2)

gtsouk
gtsouk

Reputation: 5263

Node is single threaded so there is no chance of the the 3 functions to be executed at the same time. Syncronization and race conditions only apply in multithreaded environments. There is a case though, if the first function blocks for i/o.

Upvotes: 5

Plato
Plato

Reputation: 11052

You are asking about keeping a single object synchronized as several asynchronous operations modify that object. This is a bit vague (do you need to execute them in order? do they change the same properties?) Its hard to make a catch all solution, so I suggest that you determine what order, if any, the operations must take place in, and use the async library to handle the control flow.

The async.waterfall method (example below) is useful if you want to pass results down a chain of functions that execute in order. There are many other useful functions included in the library, like async.eachSeries (execute a function once per array item in order) and async.parallel (execute an array of functions simultaneously.) All docs available at https://github.com/caolan/async

var async = require('async');
function calculateX(callback){
  async.waterfall(
  [ 
    function(done){
      var x = 0;
      asyncCall1(x, function(x1){   // add x1=x+1;
        done(null, x1);
      });
    },
    function(x1, done){
      asyncCall2(x1, function(x2){   // add x2=x1+2;
        done(null, x2);
      });
    },
  ],
  function(err, x2){
    var t = x2;
    callback(t);
  });
};

calculateX(function(x2){
  mongo.save(x2, function(err){ // or something idk mongo
    if(err){ console.log(err) };
  });
});

Upvotes: 1

Related Questions