堆栈超过了递归函数以构建tcp流

时间:2015-02-13 23:16:15

标签: node.js recursion tcp stream

我有一个在tcp流框架中递归的函数。但是,当我每秒收到大约1000个以上的数据包时,我会突然得到Max call stack exceeded或类似的东西。

我的代码是:

  var expectedRemaining = (this.expectedSz - this.receivedSz);

  if (buff.length > expectedRemaining) {
    var tmp = buff.slice(0, expectedRemaining);
    buff = buff.slice(expectedRemaining);

    recurse = true;
    this.inPacket.push(tmp);
    this.receivedSz = this.expectedSz;
  } else {
    this.inPacket.push(buff);
    this.receivedSz += buff.length;
  }

  if (this.receivedSz === this.expectedSz) {
    this.emit('data', Buffer.concat( this.inPacket, this.expectedSz));
    this.reset();
  }

  if (recurse) this.handleData(buff);

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

现在,你的函数看起来像这样(psuedocode):

this.handleData = function handleData(buf) {
   if ( someCondition ) {
      // do stuff
      recurse = true;
   }
   else {
      // do other stuff
   }

   if (recurse) {
       this.handleData(buf);
   }
};

我建议您使用setImmediate调用实现递归行为。这将允许清除堆栈帧并在再次输入函数之前发出data事件。

this.handleData = function handleData(buf) {
   if ( someCondition ) {
      // do stuff
      recurse = true;
   }
   else {
      // do other stuff
   }

   if (recurse) {
       setImmediate(function() {
           this.handleData(buf);
       });
   }
};

如果人们没有阅读评论,对于原始问题中描述的应用程序,nextTick最终会更合适。主要区别在于nextTick保证给定函数将在任何排队事件之前执行。