1

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

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 函数来管理锁定和解锁。

有什么建议么?

4

2 回答 2

5

Node 是单线程的,因此这 3 个函数不可能同时执行。同步和竞争条件仅适用于多线程环境。但是有一种情况,如果第一个功能块用于 i/o。

于 2013-10-11T14:21:58.573 回答
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) };
  });
});
于 2013-10-11T14:49:45.740 回答