【问题标题】:Prevent rxjs Subject from completing防止 rxjs 主题完成
【发布时间】:2019-12-19 11:28:15
【问题描述】:

在下面的示例代码中,testSubj 通过take 运算符订阅了两次sourceSubj 其中之一。似乎发生的情况是,当 take Observable 完成时,它会导致 testSubj 完成,即使它仍然有一个有效的订阅。

我的问题是,为什么会出现这种行为?有没有办法阻止主题完成?

rxjs 6.4

import { Subject } from 'rxjs';
import { take } from 'rxjs/operators';

const sourceSubj = new Subject<string>();

const testSubj = new Subject<string>();
testSubj.subscribe({
  next: s => console.log(`next: ${s}`), 
  complete: () => console.log(`completed`)
});

sourceSubj.pipe( take(1) ).subscribe(testSubj);
sourceSubj.subscribe(testSubj);
sourceSubj.next('1');

【问题讨论】:

    标签: javascript typescript rxjs


    【解决方案1】:

    它完成是因为它的 complete 方法在 take 运算符返回的 observable 完成时被调用。

    主题是观察者,并响应nexterrorcomplete 通知。如果您只想订阅nexterror 通知,请仅将其转发给主题:

    sourceSubj.pipe(take(1)).subscribe({
      next: value => testSubj.next(value),
      error: error => testSubj.error(error) 
    });
    

    【讨论】:

    • 感谢您的解释,我想从机械的角度来看这很简单。不过跟进一下,是否有一些标准的习惯用法(操作符?)来处理这个 rxjs 提供的,或者甚至是这个方向的东西?
    • 并非如此。 IMO,以这种方式使用主题连接单独组合的可观察流并不常见。这不是错误的,我在很多地方都这样做过——从记忆中,我将一个主题作为观察者传递给tap。我会说它不够普遍,不足以保证抽象。
    • 好的,太好了!这正是我想要的,我想我可能会有点不标准,谢谢你的澄清:)
    • 其实这里有一个例子,我把一个传给subscribe:github.com/cartant/rxjs-etc/blob/…
    【解决方案2】:

    尝试将Subject 视为具有状态的对象,一旦完成,它就会停止执行其任务

    你应该只使用merge https://codesandbox.io/embed/rxjs-subject-cb86j?fontsize=14&hidenavigation=1&theme=dark

    import { merge, Subject } from 'rxjs';
    import { take } from 'rxjs/operators';
    
    const sourceSubj = new Subject<string>();
    
    const first = sourceSubj.pipe(take(1));
    const subscription = merge(sourceSubj, first).subscribe({
      next: s => console.log(`next: ${s}`), 
      complete: () => console.log(`completed`)
    });
    
    sourceSubj.next('1');
    

    【讨论】:

    • 感谢您的回答,但您错过了我的问题的重点。我知道,当一个 Subject 完成它就会停止,令人惊讶的是,该主题订阅的任何内容的完成也会触发完成,而不管任何其他订阅如何。
    猜你喜欢
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 2020-06-05
    • 2019-02-17
    • 1970-01-01
    相关资源
    最近更新 更多