Node.js 阻止节点同时从数据库读取数据
我在mongoDB中有一组值,我只需要读取一组值。因此,当我读过它们时,我会从数据库中删除该行。但由于节点是异步的,如果我连续快速执行两次getValue(),我会得到相同的值,因为DB没有时间删除旧的值。有人知道解决这个问题的好方法吗。我能想到一对,但没有什么好的 我这里没有我的代码,所以只写了一个简单的例子来说明我的问题Node.js 阻止节点同时从数据库读取数据,node.js,asynchronous,Node.js,Asynchronous,我在mongoDB中有一组值,我只需要读取一组值。因此,当我读过它们时,我会从数据库中删除该行。但由于节点是异步的,如果我连续快速执行两次getValue(),我会得到相同的值,因为DB没有时间删除旧的值。有人知道解决这个问题的好方法吗。我能想到一对,但没有什么好的 我这里没有我的代码,所以只写了一个简单的例子来说明我的问题 Var getValue = function() { ReadfromDB(function(data){ deleteRecord(); // sho
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();
});
});
谢谢,但是我很难阅读这段代码,我从来没有承诺过。所以我认为它的作用是:你第一次阅读它时,它只是建立并返回。下次从上次获取值时。我知道什么了吗?基本上是的,它第一次运行并返回一个承诺,第二次已经有承诺并在
然后方法中执行,这意味着,它在前一个函数“完成”时执行。读一读:谢谢:)我回家后会玩它:)