【问题标题】:Do RxJS observers always process all events submitted before the observable is completed?RxJS 观察者是否总是在 observable 完成之前处理所有提交的事件?
【发布时间】:2021-10-07 14:18:41
【问题描述】:

我想确保记录在complete 上调用observable 之前提交的所有事件。

我知道存在完全停止发射事件(takeUntil 等)的运算符。

我的问题是,如果主题的完整发送太“早”,是否存在其他运营商会导致不发送排放。在某些情况下,等待观察者完成事件直到观察者处理事件是有益的?

例如,是否存在以下代码...

const subj = new Subject<string>();

subj.pipe(delay(500))
    .subscribe((val) => {
      console.log(val);
      subj.complete();
    });

subj.next('1');    

...比这更有意义...

const subj = new Subject<string>();

subj.pipe(delay(500))
    .subscribe((val) => {
      console.log(val);       
    });

subj.next('1');
subj.complete();

...什么时候主题应该只发出一个值?

或者在next 之后立即完成subject 在这种情况下总是安全的?

如果还有其他我不知道的因素(例如代码的同步与异步执行),请同时提及。

【问题讨论】:

    标签: rxjs


    【解决方案1】:

    一般来说,

    subj.next('1');
    subj.complete();
    

    是安全的。据我所知,现有的 RxJS 运算符都没有使用完成来提前取消/取消订阅 observables。

    话虽如此,我自己可以轻松创建这样的运算符。 switchMap 将在收到下一次发射时取消当前正在运行的内部可观察对象。例如,您可以创建一个自定义运算符,在收到完整事件时取消订阅并提前存在。

    但是,如果您担心那个,那么您就不走运了。无论您想象什么解决方法,我都可能编写一个会破坏您的代码的运算符。例如,filter(_ =&gt; false) 将阻止1 在您描述的两种情况下在complete 之前发出。

    最后,您和您的同事必须编写好的代码(并进行测试!),而 RxJS 不会改变这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 2019-04-09
      相关资源
      最近更新 更多