RxJS 观察者是否总是在可观察者完成之前处理所有提交的事件?

Do RxJS observers always process all events submitted before the observable is completed?

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

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

我的问题是是否存在其他运营商,如果有关该主题的完整内容也被发送,会导致发射不被发送'early'。在观察者处理事件之前等待可观察对象完成是否有好处?

例如,是否存在以下代码的情况(想象任何其他 RxJS 运算符而不是延迟)...

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 在这种情况下总是安全的吗?

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

一般来说,

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

安全。据我所知,none 的现有 RxJS 运算符使用完成 cancel/unsubscribe observables early.

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

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

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