首页 > 解决方案 > RxJS 观察者是否总是在 observable 完成之前处理所有提交的事件?

问题描述

我想确保记录之前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();

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

还是在这种情况下subject立即完成next总是安全的?

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

标签: rxjs

解决方案


一般来说,

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

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

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

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

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


推荐阅读