rxjs observable debounceTime 内部下一个被忽略

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

mar*_*tin 5

这类问题似乎被破坏了,并且可以通过 using 神奇地修复,delay(0)或者setTimeout通常意味着您期望 RxJS 始终以异步方式运行,而实际上它通常以同步方式工作,除非被迫这样做。

这正是你的情况。

顺便说一句,一种更优雅的方法是将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