阻止节点从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对象。
答
听起来像一个封闭的好用例!
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();
});
});
谢谢,但我很难读这段代码,从来没有承诺过。所以我认为它是这样做的:你第一次阅读它只是设置并返回。下次您从上次获得价值时。我在做什么? – user1930848 2014-09-02 07:14:13
基本上是,它第一次运行并*返回承诺*,第二次它已经有承诺并在'then'方法中执行,也就是说,它在前一个函数完成时执行。请阅读以下内容:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise – 2014-09-02 07:24:48
谢谢:)当我到家时,我会玩它:) – user1930848 2014-09-02 07:56:55