似乎debounceTime
忽略对它的subjectnext
方法的内部调用:
var subject: Subject<number> = new Subject<number>();
subject.pipe(
tap((a) => console.log("tab:" + a)),
debounceTime(300),
).subscribe((a) => {
console.log(a);
subject.next(100)
});
subject.next(19);
subject.next(20);
上面的代码应该创建一个无限循环-但它不会:
tab:19
tab:20
20
tab:100
如果将a添加delay(1)
到管道中,它将按预期工作:
subject.pipe(
tap((a) => console.log("tab:" + a)),
debounceTime(300),
delay(1)
).subscribe((a) => {
console.log(a);
subject.next(100)
});
我错过了什么吗?
编辑:添加了一个示例:https : //typescript-fbt2mn.stackblitz.io
这种类型的问题似乎已经坏了,可以使用delay(0)
或setTimeout
通常通过魔术解决,这意味着您期望RxJS始终保持异步运行,而实际上除非您另有规定,否则它通常是同步运行的。
这就是您的情况。
当debounce推升其值时,您位于https://github.com/ReactiveX/rxjs/blob/5.5.10/src/operators/debounceTime.ts#L100这行。
里面subscribe
调用next
该河段_next
内debounceTime
https://github.com/ReactiveX/rxjs/blob/5.5.10/src/operators/debounceTime.ts#L84该套lastValue
和hasValue
内部变量。
现在它开始在调用堆栈中向上移动,直到现在才停止处理此行https://github.com/ReactiveX/rxjs/blob/5.5.10/src/operators/debounceTime.ts#L100。此时,它继续并覆盖lastValue
并hasValue
再次覆盖https://github.com/ReactiveX/rxjs/blob/5.5.10/src/operators/debounceTime.ts#L101-L102。这将它们设置为null
和false
。
然后后300ms
debounceTime
要发出它的价值却hasValue
是null
https://github.com/ReactiveX/rxjs/blob/5.5.10/src/operators/debounceTime.ts#L99,因为它已经overrided。
顺便说一句,一种更优雅的方法是将observeOn
运算符与async
调度程序一起使用,该调度程序应比delay(1)
。
import { async } from 'rxjs/scheduler/async';
var obs = Observable.of(1, 2, 3);
var subject: Subject<number> = new Subject<number>();
subject.pipe(
tap((a) => console.log("tab:" + a)),
debounceTime(300),
observeOn(async),
).subscribe((a) => {
console.log(a);
subject.next(a+1)
});
看到您更新的演示:https : //stackblitz.com/edit/typescript-tsek9s?file=index.ts
编辑:此行为可能已在RxJS 6中更改:https : //github.com/ReactiveX/rxjs/pull/3218
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句