use*_*022 3 rxjs rxjs5 redux-observable
似乎debounceTime忽略了对它的主题next方法的内部调用:
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);
Run Code Online (Sandbox Code Playgroud)
上面的代码应该创建一个无限循环 - 但它不会:
tab:19
tab:20
20
tab:100
Run Code Online (Sandbox Code Playgroud)
如果我将 a 添加delay(1)到管道中,它会按预期工作:
subject.pipe(
tap((a) => console.log("tab:" + a)),
debounceTime(300),
delay(1)
).subscribe((a) => {
console.log(a);
subject.next(100)
});
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
编辑:添加了一个例子:https : //typescript-fbt2mn.stackblitz.io
这类问题似乎被破坏了,并且可以通过 using 神奇地修复,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)
});
Run Code Online (Sandbox Code Playgroud)
见更新演示:https : //stackblitz.com/edit/typescript-tsek9s?file=index.ts
编辑:此行为在 RxJS 6 中可能已更改:https : //github.com/ReactiveX/rxjs/pull/3218
| 归档时间: |
|
| 查看次数: |
992 次 |
| 最近记录: |