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)
都会阻止 1
在 complete
之前发出。
最后,您和您的同事必须编写好的代码(并进行测试!),而 RxJS 不会改变这一点。
我想确保在 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)
都会阻止 1
在 complete
之前发出。
最后,您和您的同事必须编写好的代码(并进行测试!),而 RxJS 不会改变这一点。