阻止节点从db同时读取

问题描述:

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

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

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

你可以尝试这样的事情。阅读被放置在删除完成时的承诺中。这可以叠加,所以如果你做了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对象。

+0

谢谢,但我很难读这段代码,从来没有承诺过。所以我认为它是这样做的:你第一次阅读它只是设置并返回。下次您从上次获得价值时。我在做什么? – user1930848 2014-09-02 07:14:13

+0

基本上是,它第一次运行并*返回承诺*,第二次它已经有承诺并在'then'方法中执行,也就是说,它在前一个函数完成时执行。请阅读以下内容:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise – 2014-09-02 07:24:48

+0

谢谢:)当我到家时,我会玩它:) – user1930848 2014-09-02 07:56:55

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

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