阻止节点同时从db读取

时间:2014-09-02 06:48:53

标签: node.js asynchronous

我在mongoDB中有一组值,我只需要读取它们。所以当我读完它们时,我会从数据库中删除该行。但由于节点是异步的,如果我快速连续两次getValue(),我得到相同的值,因为DB没有时间删除旧的。有谁知道解决这个问题的好方法。我能想到一对,但没什么好的。

我这里没有我的代码所以只写了一个快速示例来展示我的问题。

Var getValue = function() {
  ReadfromDB(function(data){
       deleteRecord(); // show that what we read has been updated
   });
}

2 个答案:

答案 0 :(得分:0)

你可以尝试这样的事情。读取被放入一个在删除完成时完成的承诺。这可以叠加,如果你执行getValue() 20次,它仍然应该以正确的顺序执行。

var getValue = function(){
    var currentPromise;
    var read = function(){
        return ReadfromDB().then(function(data){
           deleteRecord(); // show that what we read has been updated
        });
    }
    return function() {
        if(currentPromise){
            currentPromise = currentPromise.then(read)
        }else{
            currentPromise = read();
        }
    }
}

在此代码之外您需要做的是确保ReadfromDB返回一个promise对象。

答案 1 :(得分:0)

听起来像一个关闭的好用例!

var getValue = (function() {
  var called = false;
  return function() {
    if (!called) {
      called = true;
      ReadFromDB(function(data) {
        deleteRecord();
      });
    }
  };
}());

你也可以使用once做同样的事情。

var once = require('once');

var getValue = once(function() {
  ReadFromDB(function(data) {
    deleteRecord();
  });
});