Node.js 阻止节点同时从数据库读取数据

Node.js 阻止节点同时从数据库读取数据,node.js,asynchronous,Node.js,Asynchronous,我在mongoDB中有一组值,我只需要读取一组值。因此,当我读过它们时,我会从数据库中删除该行。但由于节点是异步的,如果我连续快速执行两次getValue(),我会得到相同的值,因为DB没有时间删除旧的值。有人知道解决这个问题的好方法吗。我能想到一对,但没有什么好的 我这里没有我的代码,所以只写了一个简单的例子来说明我的问题 Var getValue = function() { ReadfromDB(function(data){ deleteRecord(); // sho

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

我这里没有我的代码,所以只写了一个简单的例子来说明我的问题

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

你可以试试这样的。当删除也完成时,读取被放入一个承诺中。这可以叠加,因此如果执行
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对象。

听起来是一个很好的闭包用例

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

你也可以做同样的事情

var once = require('once');

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

谢谢,但是我很难阅读这段代码,我从来没有承诺过。所以我认为它的作用是:你第一次阅读它时,它只是建立并返回。下次从上次获取值时。我知道什么了吗?基本上是的,它第一次运行并返回一个承诺,第二次已经有承诺并在
然后
方法中执行,这意味着,它在前一个函数“完成”时执行。读一读:谢谢:)我回家后会玩它:)