rxjs可观测的去BounceTime内部下一个被忽略

rxjs可观测的去BounceTime内部下一个被忽略,rxjs,rxjs5,redux-observable,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)

似乎
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);
如果我向管道添加
延迟(1)
,它将按预期工作:

subject.pipe(
    tap((a) => console.log("tab:" + a)), 
    debounceTime(300), 
    delay(1)
).subscribe((a) => {
    console.log(a);
    subject.next(100)
});
我错过什么了吗


编辑:添加了一个示例:

这类问题似乎有问题,可以通过使用
延迟(0)神奇地解决
setTimeout
通常意味着您希望RxJS始终异步运行,而实际上它通常是同步工作的,除非强制执行其他操作

这正是你的情况

  • 当debounce推出它的值时,您就在这条线上

  • subscribe
    内部调用
    next
    到达
    \u next
    内部
    debounceTime
    设置
    lastValue
    hasValue
    内部变量

  • 现在它开始在调用堆栈中向上移动,直到现在它才停止处理这一行。此时,它继续并再次覆盖
    lastValue
    hasValue
    。这将它们设置为
    null
    false

  • 然后在
    300ms
    debounceTime
    之后,想要发出它的值,但是
    hasValue
    null
    ,因为它已经被覆盖

顺便说一句,更优雅的方法是使用
observeOn
操作符和
async
调度程序,该调度程序应该比
delay(1)
更高效

从'rxjs/scheduler/async'导入{async};
var obs=可观测的(1,2,3);
变量主题:主题=新主题();
主题:烟斗(
轻触((a)=>console.log(“选项卡:+a)),
去BounceTime(300),
observeOn(异步),
).认购((a)=>{
控制台日志(a);
主题。下一个(a+1)
});
见更新的演示:


编辑:这种行为在RxJS 6中可能已经改变了:

这种用法在我看来就像一个边缘案例,我从来没有做过类似的事情。RxJS在通知观察者后,看起来会“重置”去盎司时间,这是一个自RxJS旧版本以来的同步操作。让我来回答这个问题,你想要达到什么样的行为?你的变通方法有什么问题吗?似乎与epic有关!非常感谢您的解释-完全预期的异步行为:)这确实是一个非常史诗般的解释(注释将自毁)。干得好。
subject.pipe(
    tap((a) => console.log("tab:" + a)), 
    debounceTime(300), 
    delay(1)
).subscribe((a) => {
    console.log(a);
    subject.next(100)
});
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)
});