我对RxJS世界还很陌生(请原谅我的语义),但是我已经看到了一些代码示例,这些代码创建一个Subject来做一些工作,然后调用next(0)或next( 'r')。似乎可以重新运行流,或者从流中获取下一个值。
但是,当我尝试使用它来调用一些数据的API时,它会完全跳过应按照流中的定义进行的工作(假设它将再次“运行”流并从服务器中获取新数据) ),而当我尝试像这样调用next时,我的订户会返回“ r”或零值。
可以这么说,我可以使订阅“开始执行流”,但是如果要“重新运行”,则必须取消订阅,然后每次重新订阅。
使用看似冗余的值来调用是一种惯例吗?我是以错误的方式使用它,还是有一个很好的用例来调用下一个?我确定我缺少一些基本知识,或者我对它的工作原理的理解是错误的。
答案 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.
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
,表示冷可观察。
您可以尝试使用BehaviorSubject
或ReplaySubject
-它们都很热,但是请注意它们的行为有所不同。
在您的示例中,您可以如下修改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);