Получить только самое последнее значение из ReplaySubject - PullRequest
0 голосов
/ 13 декабря 2018

Скажем, у меня есть 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 голосов
/ 28 декабря 2018

Вполне возможно использовать оператор 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 для вас, посмотрите консольжурналы.

0 голосов
/ 13 декабря 2018

Я не уверен, как это сделать со стороны потребителя, но со стороны производителя мы можем передать целое число конструктору следующим образом:

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

Если кто-то знает, как это сделать со стороны потребителя, это было бы здорово, пожалуйста, дайте мне знать.

...