同步node.js对象

时间:2013-10-11 14:15:31

标签: node.js synchronization

我正在使用一个变量,一次被许多函数使用。我需要同步它。我该怎么做?

var x = 0;

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

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

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

这是我的代码的简化逻辑。为了提供更多的洞察力,X与我的mongoDB对象一样好,一次只需要一个函数使用。另外3个函数就像REST api调用一样,因此有可能同时调用它们。

我需要编写getX函数来管理锁定和解锁。

有什么建议吗?

2 个答案:

答案 0 :(得分:5)

节点是单线程的,因此不可能同时执行3个函数。同步和竞争条件仅适用于多线程环境。但是,如果第一个功能阻止了i / o,则存在一种情况。

答案 1 :(得分:1)

您要求将单个对象保持为几个同步 异步操作修改该对象。这有点模糊(你需要按顺序执行它们吗?它们是否会改变相同的属性?)很难找到所有解决方案,所以我建议你确定操作必须在哪个顺序(如果有的话)中进行,并使用async库来处理 控制流程。

如果要传递,async.waterfall方法(下面的示例)非常有用 结果是一系列按顺序执行的函数。还有很多其他的 库中包含的有用函数,如async.eachSeries(按顺序每个数组项执行一次函数)和 async.parallel(同时执行一系列功能。)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) };
  });
});