Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js异步控制流,3个进程处理共享数据_Javascript_Node.js_Asynchronous_Promise_Async.js - Fatal编程技术网

Javascript 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应用程序,有3个函数,每个函数都有自己的时间间隔(或者可以由另一个事件触发):

  • 加工订单
  • 清除过期订单
  • 清除取消订单
函数正在处理共享数据,因此此时只有一个函数可以访问此数据

当发生冲突时,它应该等到实际函数结束,然后立即运行第二个函数,但只运行一次

例如,如果有processOrders正在运行,并且ClearCanceledOrders被触发100次,则在processOrders完成其工作后,它将只运行ClearCanceledOrders一次


如何在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一次。”哦,我完全没有注意到这一点,尽管它是巨大而粗体的,但我的错。让我修一下。