javascript - rxjs 的错误和完整方法如何工作?
问题描述
最近我读到了 rxjs。此代码来自文档。
import { Observable } from 'rxjs';
const observable = new Observable(subscriber => {
setTimeout(() => {
subscriber.complete();
subscriber.next(1);
}, 1000);
});
observable.subscribe({
next(x) { console.log('got value ' + x); },
error(err) { console.error('something wrong occurred: ' + err); },
complete() { console.log('done'); }
});
console.log('just after subscribe');
正如它所说,如果传递了错误或完成通知,那么之后就无法传递任何其他内容。如何使用纯 js 在后台完成?有没有办法改变订阅功能并在完成/错误方法执行时动态返回?
解决方案
RxJS 的工作方式非常有趣。我在这个SO answer中分享了我对它的看法。我试图涵盖如何Observable.pipe
,Observable.subscribe
以及如何Subject.observers
在幕后工作。
但要点是这样的(再次,这是我花了一些时间阅读源代码后的观点):
RxJS 通过链表实现其功能。
基本上,有2个链表。一个是在 的帮助下创建的Observable.pipe()
,其节点由运算符(例如filter
、take
、map
)定义,另一个是在 上创建的Observable.subscribe()
。这是subscribers
清单。
一个运算符伴随着一个Subscriber
实例。例如,map
运算符具有MapSubscriber
. 在 RxJS 7 之前,操作符的订阅者是这样调用的,现在它使用一种非常聪明的方式来注入定义操作符的逻辑。
如何使用纯 js 在幕后完成
如前所述,每个Subscriber
都有next()
, error()
,complete()
方法。例如,这是发生在error()
:
error(err?: any): void {
if (!this.isStopped) {
this.isStopped = true;
this._error(err);
}
}
isStopped
确保没有其他next
通知可以通过:
next(value?: T): void {
if (!this.isStopped) {
this._next(value!);
}
}
当然,这不是error
事件发生时唯一发生的事情,RxJS 还负责拆卸逻辑,释放资源。
推荐阅读
- android - 带有 ARM CPU M1 的 macOS 上的 Android Studio/Emulator
- git - 在 Gitlab CI 中如何知道分支是否是第一次在舞台上运行?
- c# - 运行 .NET Core 3.0 时未经授权访问 C:\Users
- python - python rabbitMQ 消费者,它消费一条消息并调用作为后台进程运行的 API
- react-native - 使用类似于材料 ui 的所需星号符号对本机文本输入做出反应
- assembly - 用str替换stp的正确方法是什么?
- xml - 如何使用 Export-CliXml 导出从 Invoke-RestRequest 返回的原始 XML?
- kotlin - 如何在 Kotlin 中修改地图内的数组
- apache-spark - Pyspark:如何按日期过滤并读取按日期分区的镶木地板文件
- c++ - 在 OpenGL 的 3D 平面上渲染 2D 矩形时遇到问题