仅从ReplaySubject获取最新值

时间:2018-12-13 03:30:21

标签: rxjs6

说我有一个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())

但是那些没有用。

2 个答案:

答案 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

如果有人从消费者方面知道如何做到这一点,那就太好了,请告诉我。