我有一个在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);
有什么建议吗?
答案 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
保证给定函数将在任何排队事件之前执行。