Как я могу создать холодную тему в RxJS?


По умолчанию субъект RxJs является "жарко", но возможно ли творить "холодно" субъект, чтобы получить все значения, распространяемые от него с самого начала?

То есть:

let s = new Subject();
s.next(1);
s.next(2);
s.subscribe(n => console.log(n)); //to get here 1 2 3
s.next(3);
2 2

2 ответа:

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

const subject = new Rx.ReplaySubject(10);

subject.next("1");
subject.next("2");
subject.next("3");
subject.next("4");
subject.next("5");

subject.subscribe(
  (val) => console.log(val)
);    

subject.next("6");

// Logs out 
// 1
// 2
// 3
// 4
// 5
// 6

Jsbin: http://jsbin.com/rocofa/edit?js, консоль

ReplaySubject ведет себя именно так, как вы описываете. Смотрите ReactiveX Subject docs для получения более подробной информации.