最近在做这个数据可视化项目,为了防止用户狂刷不止,尝试引入Rxjs做回压处理。在开发中老孟错误地使用了Subject,而且这个错误是共性的,此篇记录探险过程。
开局一张图,上边那个不算
上图来自这篇文章文中如此描述Subject:
Subject is both an Observable and Observer
结尾对Suject的使用场景有明确的介绍:
When to use Subject
You need to share the same observable execution.
When you need to decide what to do when an observer arrives late, do we use ReplaySubject, BehaviorSubject?
You need full control over the next(), error() and complete() methods.
S有Observable & Observer双重身份,是为处理多播而存在的。
依老孟看,S跟搞传销的差不多:既能收货(数据),又把货发给一众下游。我可以这样:
const subject = new Subject();
subject.next('1');
subject.next('2');
subject.subscribe( console.log);
那我为什么还要辛苦用O?全用S不就成了?不多播难道不让用吗?直觉告诉我这里头有事,调查一下:
我在Rxjs中文社区,找到了另一篇文章:[译]关于 RxJS 中的 Subject。文章开头就提到了我的问题:
.......(S)很有帮助,但这不是以 “Rx 的方式”在处理问题。理想的是在 Observable 中包装事件注册,既可以监听事件,又可以取消事件监听。看起来像这样:
const clicks = new Observable(observer => {
const handler = (e) => observer.next(e);
button.addEventListener('click', handler);
return () => button.removeEventListener('click', handler);
});
风格原因?这不足以让老孟抛弃Subject,所有逻辑是全挤在一个方法里太烦人了。继续调查:
......
......
好吧...老孟选择直接做伸手党 ,联系到了Rxjs中文社区的发起者,”大哥一下“:
大哥永远会把你的问题变成更多问题:
- 乱用命令式的S会有带来怎样的具体问题?
- asObservable是个啥?(语义上来看应该是将S视为O)
- 如何用O代替S(或者说‘如何将S变成O’)?
(ps: 虽然egghead搞圣诞节打折,但年费也要十张毛爷爷,md,这年头没钱想搬砖都搬不起)
中文资料已经不能满足老孟了,沿着大哥的提示找到了egghead上的教学。虽然老孟买不起,但是提供了key供我搜索。我google到了这篇文章:Converting A Subject To An Observable Using RxJS In Angular 2,看标题就知道,这篇文章很老,但思想是正确的,切实的解决了我的疑惑(请注意这篇的作者Ben Nadel和Ben Christensen不是一个Ben)
对于这篇文章的解读,且听下回分解~~
网友评论