rxjs - 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
总是安全的?
如果还有其他我不知道的因素(例如代码的同步与异步执行),请同时提及它们。
解决方案
一般来说,
subj.next('1');
subj.complete();
是安全的。据我所知,现有的 RxJS 运算符都没有使用完成来提前取消/取消订阅 observables。
话虽如此,我自己可以轻松创建这样的运算符。switchMap
当它接收到它的下一个发射时,将取消当前正在运行的内部 observables。例如,您可以创建一个自定义操作符,该操作符在收到完整事件时取消订阅并提前存在。
但是,如果您对此感到担心,那您就不走运了。无论您想象什么解决方法,我都可能编写一个会破坏您的代码的运算符。例如,在您描述的两种情况中的任何一种中,filter(_ => false)
都会阻止在1
之前发出。complete
最后,您和您的同事必须编写好的代码(并进行测试!),而 RxJS 不会改变这一点。
推荐阅读
- html - 使用变量时反应危险SetInnerHTML不起作用
- javascript - 从 html 中删除 jquery 中的元素的功能无法正常工作
- java - org.xml.sax.SAXException:更新“CVE-2018-17481”时出错
- node.js - 使用gridfs上传数组时如何设置自定义字段
- c# - 从继承具体类对抽象类进行类型推断
- javascript - 在 Laravel 5.7 事件监听器中运行 Javascript
- python - 如何使用具有以下限制的 ipython 获得二阶连接?
- azure-cli - 使用 jmespath 过滤嵌套数组(使用 az cli)
- node.js - 在另一个模块的对象内模拟函数(节点+笑话)
- python - Scrapy 在抓取一长串 url 时卡住了