是否有基于Node中事件序列控制流的好模式?

时间:2013-07-17 13:00:59

标签: node.js control-flow

在Node中,创建一个公平的架构非常容易。但是如果我有一个我无法控制的流API(通过socket.io)的客户端,我的客户需要根据不同的事件序列做出不同的反应。如果 2个不同序列的例子:

  • 首先下订单>第二个订单
  • 首先下订单>按行业命中的第一笔订单>第二个订单

到目前为止,我正在使用Transform Streams,我正在考虑创建复杂的自定义逻辑,在需要时对所需的消息进行缓冲并对​​其进行操作,但我想知道是否有最佳实践来处理这种情况

由于

1 个答案:

答案 0 :(得分:1)

这个想法是定义一组定义事件序列的对象,当你得到第一个匹配的事件时,你复制那个序列,然后弹出数组的元素,直到你没有更多的元素。 如果遇到不匹配的事件,则重置当前缓冲区。

var events = [
{ sequence : ['event 1', 'event 2', 'event4']
  handler: firstSequenceHandler
},
{ sequence : ['event 3', 'event 2']
  handler: secondSequenceHandler
}
];

订阅您的活动流:

var eventbuffer;
var handler;
on('data', function(event){
  if(eventbuffer){ // we already have started a sequence:
    var expectedEvent = eventbuffer.pop(); // get the next expected event
    if(expectedEvent === event && eventbuffer.length===0)
      return handler();
    else{
      // reset buffer:
      eventbuffer = null;
      handler = null;
    }
  }
  // check if the event is in your list of events as the first item.
  // if so
  eventbuffer = event.sequence.slice(0); // copy the sequence.
  handler = event.handler;
  eventbuffer.pop(); // remove the first element as you found it.
));