首页 > 解决方案 > 管道 Observable 到 Subject 不会让它不必要地变热

问题描述

这个问题建立在这个问题的基础上,它展示了如何将一个Observable输入到一个Subject. Observable我的问题类似,但除非必要,否则我想避免过热,以免.pipe()不必要地运行。例如:

const subject$ = new Subject();
const mouseMove$ = Observable.fromEvent(document, 'mousemove')
                             .pipe(map(it => superExpensiveComputation(it)));
mouseMove$.subscribe(n => subject$.next(n));

由于订阅,这会变得mouseMove$很热,并且superExpensiveComputation会在每次鼠标移动时运行,无论是否有人在监听它subject$

如何在没有不必要运行的情况下mouseMove$输入 into的结果?subject$superExpensiveComputation

标签: rxjs

解决方案


您可以简单地使用tap而不是subscribe将排放传递给您的主题:

const mouseMove$ = fromEvent(document, 'mousemove').pipe(
  map(it => superExpensiveComputation(it)),
  tap(subject$)
);

当然,您仍然需要订阅以mouseMove$使数据流动,但您不需要专门用于将数据传递给您的主题的订阅。

但是,您可能需要添加share,以免为多个订阅者重复昂贵的逻辑。

const mouseMove$ = fromEvent(document, 'mousemove').pipe(
  map(it => superExpensiveComputation(it)),
  share(),
  tap(subject$)
);

但是......那么在那种情况下,你真的需要一个主题吗?除非你打算.next()从其他地方打电话,否则你可能不会。


推荐阅读