Mar*_*ski 7 javascript reactive-programming rxjs rxjs5 angular
假设我有两个类,你可以观察一些可观察的类.
第一个例子,公共主题:
class EventsPub {
public readonly onEnd = new Subject<void>();
}
Run Code Online (Sandbox Code Playgroud)
第二个例子,私人主题和注册方法:
class EventsPriv {
private readonly endEvent = new Subject<void>();
public onEnd(cb: () => void): Subscription {
return this.endEvent.subscribe(cb);
}
}
Run Code Online (Sandbox Code Playgroud)
第一个示例在某种程度上是不安全的,因为任何人都可以eventsPub.endEvent.next()从类外调用并引入副作用,但是,与示例2相比它允许管道,这是一个很大的优势,因为开发人员可以为ex.只注册第一个事件eventsPub.onEnd.pipe(first()).subscribe(cb).
第二个例子也允许一次性订阅,但需要更多的代码和丑陋的取消订阅.
const subscription = eventsPriv.onEnd(() => {
// logic..
subscription.unsubscribe()
});
Run Code Online (Sandbox Code Playgroud)
从您的角度来看,哪种方式最好?或者也许有更好的解决方案?
mar*_*tin 10
这很大程度上取决于我个人的偏好,但我会这样做:
class EventsPriv {
private readonly endEvent = new Subject<void>();
get endEvent$(): Observable<void> {
return this.endEvent;
}
}
Run Code Online (Sandbox Code Playgroud)
因此,在endEvent我仍然可以使用它的类中,例如.在与obj.endEvent$ | async外部一起使用的模板中,它的行为类似于Observable.
注意,实际上我正在返回相同的实例Subject.唯一限制外界滥用它的obj.endEvent$.next()是Typescript的类型守卫.如果我只使用JavaScript,或者我将其类型化,any我可以打电话next.
这实际上是暴露Subjects而不是使用asObservable()运算符的推荐方法.您可以注意到这在RxJS 5内部随处使用.例如,如果您查看repeatWhensynopsys:
public repeatWhen(notifier: function(notifications: Observable): Observable): Observable
Run Code Online (Sandbox Code Playgroud)
您可以看到该notifier函数接收一个Observable作为参数(您可以在此处的代码中看到它以及https://github.com/ReactiveX/rxjs/blob/5.5.6/src/operators/repeatWhen.ts#L29).
但是如果你查看调用函数的代码,你会发现它们实际上是在传递a Subject而不是Observable:https://github.com/ReactiveX/rxjs/blob/5.5.6/src/operators/repeatWhen. ts#L114-L115.
这已在RxJS GitHub页面上讨论过,其原因在于性能和Typescript类型保护就足够了.您可以在以下讨论中阅读更多内容:
| 归档时间: |
|
| 查看次数: |
708 次 |
| 最近记录: |