说我有一个ReplaySubject:
const rs = new ReplaySubject();
rs.next(1);
rs.next(2);
rs.next(3);
如果我这样做:
rs.pipe(take(1)).subscribe(v => {});
我将获得第一个值,但是如何获得最近的值3?
我尝试过
rs.pipe(takeLast(1))
rs.pipe(last())
但是那些没有用。
答案 0 :(得分:1)
完全可以使用last()
运算符。那就是您曾经在主题上使用complete()
。
import { ReplaySubject, timer } from 'rxjs';
import { last } from 'rxjs/operators';
const rs = new ReplaySubject();
rs.pipe(last()).subscribe(v => console.log(v));
timer(1000).subscribe(() => rs.next('a'));
timer(2000).subscribe(() => rs.next('b'));
timer(3000).subscribe(() => rs.next('c'));
timer(4000).subscribe(() => rs.complete());
// after 4s prints 'c'
在这里您可以看到,在4秒后控制台将打印最后发出的值c
。
但是,如果您简单地订阅ReplaySubject
,它将始终打印最后一个传递的值。
const rs2 = new ReplaySubject();
rs2.subscribe(v => console.log(v));
timer(1000).subscribe(() => rs2.next(1));
timer(2000).subscribe(() => rs2.next(2));
timer(3000).subscribe(() => rs2.next(3));
// after 1s prints 1
// after 2s prints 2
// after 3s prints 3
我为您准备了stackblitz,请查看控制台日志。
答案 1 :(得分:0)
我不确定如何从消费者端执行此操作,但是从生产者端,我们可以像这样将整数传递给构造函数:
const rs = new ReplaySubject(1); // pass 1 to the constructor
rs.next(1);
rs.next(2);
rs.next(3);
rs.subscribe(v => console.log('the value is:', v));
现在您将获得以下输出:
值是:3
如果有人从消费者方面知道如何做到这一点,那就太好了,请告诉我。