我正在使用一个变量,一次被许多函数使用。我需要同步它。我该怎么做?
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函数来管理锁定和解锁。
有什么建议吗?
答案 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) };
});
});