Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 受试者丢失事件_Javascript_Rxjs_Rxjs5_Ngrx - Fatal编程技术网

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

有人能解释这三种变体之间的区别吗

  • 首先作为例外,处理所有事件
  • 但第二个输了最后一个项目(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 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()