Javascript 受试者丢失事件
有人能解释这三种变体之间的区别吗Javascript 受试者丢失事件,javascript,rxjs,rxjs5,ngrx,Javascript,Rxjs,Rxjs5,Ngrx,有人能解释这三种变体之间的区别吗 首先作为例外,处理所有事件 但第二个输了最后一个项目(3) 三输二(2) 请您帮助我了解问题所在,以及如何使第三种变体处理所有事件 1. 输出: in 0 in 2 out 0 -> 1 in 1 out 2 -> 3 in 3 in 0 in 2 out 0 -> 1 in 1 out 2 -> 3 in 0 in 2 out 2 -> 3 in 3 2. 输出: in 0 in 2 out 0 -> 1
in 0
in 2
out 0 -> 1
in 1
out 2 -> 3
in 3
in 0
in 2
out 0 -> 1
in 1
out 2 -> 3
in 0
in 2
out 2 -> 3
in 3
2.
输出:
in 0
in 2
out 0 -> 1
in 1
out 2 -> 3
in 3
in 0
in 2
out 0 -> 1
in 1
out 2 -> 3
in 0
in 2
out 2 -> 3
in 3
3.
输出:
in 0
in 2
out 0 -> 1
in 1
out 2 -> 3
in 3
in 0
in 2
out 0 -> 1
in 1
out 2 -> 3
in 0
in 2
out 2 -> 3
in 3
这一切实际上都是预期的行为 令人困惑的是,当您多次重用
Subject
和take()
等操作符时会发生什么
操作员take(1)
只获取一个值并发送complete
通知。由于.subscribe(bs2)
,主题收到此通知。现在是最重要的部分。当
主题
收到完成
或错误
通知时,它会将自身标记为已停止。这意味着它永远不会汇款任何项目或通知,这是Rx中正确和预期的行为。通知完成
或错误
必须是最后一次排放
因此,Subject
由第一个take(1)
完成,它由值0
触发(调用bs2.next(0)
)
然后,当值2
触发第二次运行可观察的.interval(0).take(1)
时,受试者会收到该值,但会自动忽略该值,因为受试者已标记为已停止
第三个演示中的过程完全相同
您可以在Subject.ts的源代码中看到它:
哦,谢谢,这很有道理。然而,我试着根据你的建议修复它,第二个变体现在正在工作。但第三条仍然会丢失第二条信息。顺便说一句,这意味着ngrx中的@Effects工作错误?我永远不会将任何已完成的收藏返回结果?但在他们的例子中,他们发送数组作为结果,据我所知,它是有效的?我不知道你期望的“第二条消息”是什么。我建议您单独测试这一点,而不要与其他示例混淆。这是应该的。请注意您使用的是switchMap()
,第二个switchMap()
返回Rx.Observable.empty()
(这只是一个完整的通知)。我知道,现在它可以工作了。这意味着我们不能只发送两条消息就获得一种效果。在这种情况下,我们重写了waitingobservable(将其切换到另一个)。我的主要想法是了解ngrx中的效果是如何工作的。我试着让它变得简单和测试:)谢谢!我不知道这是如何在ngrx
中实现的。使用merge()。也许试着简化你想做的事情,因为你的演示没有那么简单,然后再发一个问题。顺便说一句,如果您不确定每个操作员都做了什么,请查看源代码,因为它通常并不难理解。例如toArray()