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)
});