我有一个有趣的例子,不是现实生活中的任务,但无论如何:
const signal = new Subject();
let count = 0;
const somecalculations = (count) => console.log('do some calculations with ', count);
console.log('Start');
signal.pipe(take(1500)/*, observeOn(queueScheduler)*/)
.subscribe(() => {
somecalculations(count);
signal.next(count++);
console.log('check if reached ', count)
});
signal.next(count++);
console.log('Stop');
Subject.next以同步的方式工作,所以如果我注释掉observeOn(queueScheduler) - 它会导致堆栈溢出(我用控制操作符控制迭代次数,而在我的计算机上如果数字大于1370则会导致SO)。
但是如果我把queueScheduler放在那里 - 它运作良好。 QueueScheduler是同步的,它以某种方式允许当前onNext处理程序运行完成运行,然后启动下一个计划运行。
有人能用源代码详细解释给我吗?我试图挖掘它,但目前取得了部分成功。这是关于observeOn如何与QueueScheduler一起工作,但答案正在逃避我。
感谢cartant的支持。好像我理解为什么队列调度程序在没有SO的情况下工作。