在RxJS主题的​​上下文中next('r')的目的是什么

时间:2019-10-16 14:52:07

标签: reactjs rxjs

我对RxJS世界还很陌生(请原谅我的语义),但是我已经看到了一些代码示例,这些代码创建一个Subject来做一些工作,然后调用next(0)或next( 'r')。似乎可以重新运行流,或者从流中获取下一个值。

但是,当我尝试使用它来调用一些数据的API时,它会完全跳过应按照流中的定义进行的工作(假设它将再次“运行”流并从服务器中获取新数据) ),而当我尝试像这样调用next时,我的订户会返回“ r”或零值。

可以这么说,我可以使订阅“开始执行流”,但是如果要“重新运行”,则必须取消订阅,然后每次重新订阅。

使用看似冗余的值来调用是一种惯例吗?我是以错误的方式使用它,还是有一个很好的用例来调用下一个?我确定我缺少一些基本知识,或者我对它的工作原理的理解是错误的。

1 个答案:

答案 0 :(得分:1)

这是一个很好的问题,我绝对建议您阅读有关 hot cold Observables的信息。

  • 每当有人subscribe对其进行观察时,可观察对象就会执行。
const a$ = of(5).pipe(tap(console.log))

a$.subscribe(); // the 'tap' will be executed here
a$.subscribe(); // and here, again.
  • hot 可观察对象并不在乎执行方面的订阅:
const a$ = of(5).pipe(
  tap(console.log),
  shareReplay(1)
);

a$.subscribe(); // the 'tap' will be executed here
a$.subscribe(); // but not here! console.logs only once

在您的示例中,您使用的是Subject,表示可观察。 您可以尝试使用BehaviorSubjectReplaySubject-它们都很热,但是请注意它们的行为有所不同。

在您的示例中,您可以如下修改Subject

const mySubject = new Subject();

const myStream$ = mySubject.pipe(
  shareReplay(1)
);

myStream$.subscribe(x => console.log(x))

mySubject.next(1);
mySubject.next(2);
mySubject.next(3);