Javascript Node.js异步控制流,3个进程处理共享数据
我有node.js应用程序,有3个函数,每个函数都有自己的时间间隔(或者可以由另一个事件触发):Javascript Node.js异步控制流,3个进程处理共享数据,javascript,node.js,asynchronous,promise,async.js,Javascript,Node.js,Asynchronous,Promise,Async.js,我有node.js应用程序,有3个函数,每个函数都有自己的时间间隔(或者可以由另一个事件触发): 加工订单 清除过期订单 清除取消订单 函数正在处理共享数据,因此此时只有一个函数可以访问此数据 当发生冲突时,它应该等到实际函数结束,然后立即运行第二个函数,但只运行一次 例如,如果有processOrders正在运行,并且ClearCanceledOrders被触发100次,则在processOrders完成其工作后,它将只运行ClearCanceledOrders一次 如何在node.js中
- 加工订单
- 清除过期订单
- 清除取消订单
如何在node.js中解决这个问题?或者你对如何解决这项任务有其他想法吗?下面是一个简单的例子,说明如何通过承诺来完成这项任务:
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;
});
}
您需要一个消息队列,而您的需求仍然定义不清。请在这里发布之前进行更多研究。试试Kue。还要看看RabbitMQ或ZeroMQ的设计。具体来说,它是不完整的,因为您没有定义ClearCancelleOrder何时重新启用。适当的并发控制使这成为一个巨大的问题。对于“入门”,消息队列应该给你一些东西给谷歌,如果你有一个开始,也许可以在这里发布一个问题。我会看看它,最初我期望的是类似承诺或基于事件的解决方案,我不能确切地想象它应该如何为我的任务工作。。但是我将通过
对消息队列进行研究。那么()
在这里是不够的。OP希望“如果ClearCancelleOrders[在其他处理过程中]被触发100次,它将[在其他任务完成后]只运行ClearCancelleOrders一次。”哦,我完全没有注意到这一点,尽管它是巨大而粗体的,但我的错。让我修一下。