Node.js异步控制流,3个进程处理共享数据



我有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;
   });
}

最新更新