【发布时间】:2019-12-03 10:07:04
【问题描述】:
我正在尝试开发一个类似 RxJS 的方案:一个基于事件的“可观察”对象。到目前为止,一切都很好 !
除了默认的类似 RxJS 的推送模式之外,当我尝试在方案中添加“拉模式”时,问题就出现了。
我试图了解代码的哪一部分似乎用完了堆栈。
这是一个运行良好的 sn-p:
const { Channel } = require('./channel');
var c = new Channel();
c.onClosed( (e) => {
console.log(e);
console.log("Done");
});
c.listen( (e) => {
console.log(e);
});
let i = 0;
for (i=0; i<1000000; i++) {
c.send(++i);
}
c.close(i);
这里是触发异常的sn-p:
const { Channel } = require('./channel');
var sc = new Channel();
let i = 0;
sc.onClosed( (e) => {
console.log(e);
console.log("Done");
});
sc.sendAll( () => {
if (i<100000) {
sc.send(++i);
console.log(i);
}
sc.close(i);
});
sc.listen( (e) => {
console.log(e);
sc.next();
});
sc.send(1);
这是lib的相关部分:
const EventEmitter = require('events');
class Channel {
id: string;
emitter: any;
isClosed: boolean;
constructor() {
this.emitter = new EventEmitter();
this.isClosed = false;
}
listen = (callback) => {
this.emitter.on("data", callback);
}
send = (value) => {
this.emitter.emit("data", value);
}
next = () => {
this.emitter.emit("received");
}
sendAll = (callback) => {
this.emitter.on("received", callback);
}
close = (value) => {
this.isClosed = true;
this.emitter.emit("closed", value);
}
onClosed = (callback) => {
this.isClosed = true;
this.emitter.on("closed", callback);
}
}
module.exports = {
Channel: Channel
}
如果迭代次数(“channel”上的“send()”调用次数超过 10.000 次),第二个 sn-p 会触发 RangeError 异常
【问题讨论】:
标签: javascript node.js data-structures reactive-programming