【问题标题】:Synchronize node.js object同步 node.js 对象
【发布时间】:2013-10-11 14:15:30
【问题描述】:

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

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

有什么建议吗?

【问题讨论】:

  • couchdb 会告诉您是否尝试写入自访问该对象后已更新的对象(即您尝试写入的对象的 _rev 属性与当前的 @987654323 不匹配@. 这让我有机会捕捉错误并使用最新的对象重新计算我的任务。mongdoDB 肯定有一些类似的功能吗?

标签: node.js synchronization


【解决方案1】:

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

【讨论】:

  • 是的。但是,如果所有 3 个函数都是 REST api 并且可能同时被调用怎么办。在这方面有什么建议吗?
  • 这并不只适用于 node.js。对于 JavaScript,这通常应该是正确的。
  • @Gaurav REST 调用应该以异步方式完成。因此,一次只会返回一个结果。那里没问题。
  • 实际上我正面临这个问题,即 REST 调用正在访问公共数据库对象并由于竞争条件而崩溃。
  • 您可以使用普通变量作为标志,这样其他函数就不会进入临界区并在重试之前有超时。
【解决方案2】:

您是在询问如何将单个对象同步为多个 异步操作修改该对象。这有点含糊(您需要按顺序执行它们吗?它们会更改相同的属性吗?)很难做出一个包罗万象的解决方案,所以我建议您确定操作必须发生的顺序(如果有) , 并使用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) };
  });
});

【讨论】:

    猜你喜欢
    • 2018-04-12
    • 1970-01-01
    • 2018-03-30
    • 2013-05-11
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 2017-05-16
    • 2017-06-17
    相关资源
    最近更新 更多