我有node.js应用程序有3个函数,每个函数都有自己的间隔(或可以由另一个事件触发):
- processOrders
- clearExpiredOrders
- clearCancelledOrders
函数处理的是共享数据,所以在同一时间只有一个函数可以访问这些数据。
当发生冲突时,它应该等待,直到实际函数结束,然后立即运行第二个函数,但只能运行一次。
例如,如果processOrders正在运行,并且clearCancelledOrders被触发100次,则在processOrders完成其工作后,它将只运行clearCancelledOrders一次。
如何在node.js中解决这个问题?或者你有其他解决这个问题的办法吗?
下面是一个简单的promise示例:
var p = Promise.resolve(); // assuming Bluebird promises or Node 0.11.13+ with Promises.
// create a new empty resolved promise.
function doFirst(act){
return p = p.then(function(){
return someFirstAction(act); // assumes someFirstAction returns a promise
})
}
function doSecond(act){
return p p.then(function(){
return someSecondAction(act); // assumes someFirstAction returns a promise
})
}
这是队列在单链上的操作。当它解析时,链也解析了。它还返回返回的承诺,因此您可以打开它并获取值。
例如:doFirst(1);
doSecond(2);
// some point in the future
doFirst(3).then(function(value){
// both doFirst(1) and doSecond(2) are done here
// the value argument is the resolution value of doFirst(3)
});
如果你不确定如何将你的API转换为承诺-参见这个问题。
由于您还希望限制特定操作的运行次数,因此可以为它创建特殊方法:
doFirst.queued = false;
function doFirst(act){
if(doFirst.queued) return; // already queued
doFirst.queued = true;
return p = p.then(function(){
return someFirstAction(act).finally(function(){
doFirst.queued = false;
});
})
}
doSecond.queued = false;
function doSecond(act){
if(doSecond.queued) return; // already queued
doSecond.queued = true;
return p = p.then(function(){
return someSecondAction(act); // assumes someFirstAction returns a promise
}).finally(function(){
doSecond.queued = false;
});
}