同步node.js对象

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

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

有什么build议么?

节点是单线程的,所以这三个函数不可能同时被执行。 同步和竞争条件仅适用于multithreading环境。 有一种情况,如果第一个function块为I / O。

由于多个asynchronous操作修改该对象,所以您正在询问是否保持单个对象同步。 这是有点模糊的(你是否需要按顺序执行它们?他们是否改变了相同的属性?)它很难做出一个捕获所有的解决scheme,所以我build议你确定什么样的顺序,如果有的话,必须发生,并使用async库来处理控制stream。

async.waterfall方法(下面的例子)是有用的,如果你想要传递结果顺序执行的函数链。 还有很多其他有用的function,如async.eachSeries (每个数组项目按顺序执行一次函数)和async.parallel (同时执行一个函数数组)。所有文档可在https://github.com / caolan /asynchronous

 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) }; }); });