Array.map
преобразует каждый элемент одного массива.
console.log( [ 1, 2, 3 ].map(x => x * x) )
// log: [ 1, 4, 9 ]
В общем случае наблюдаемые объекты RXJS больше похожи на поток данных, но все данные являются егособственная сущность.
Вы можете хранить массивы в своем Observable, но, тем не менее, каждый массив обрабатывается как одна сущность.Каждый раз, когда вы вызываете Subject#next
, вы предоставляете совершенно новый массив.В этом сценарии нет эквивалента Array#push
с RXJS, потому что RXJS не заботится , что содержимое Observable является массивом.
// Observable that holds an array as its type
const subject: Subject<number[]> = new Subject<number[]>();
subject.pipe(
// the value here is a full array
map(arr => arr.map(x => x * x))
).subscribe(arr => console.log(arr));
subject.next([ 1, 2, 3 ]);
// log: [ 1, 4, 9 ]
subject.next([ 7, 8, 9 ]);
// log: [ 49, 64, 81 ]
* Бонус: вы можете вроде заставить что-то действовать более как массив, если вы установите ReplaySubject
.Эта реализация Subject
буквально воспроизводит все данные, которые были ему предоставлены (или подмножество, основанное на том, как вы его создаете).Тем не менее, как вы увидите, ограничением этого является то, что вы можете нажимать только на конец, и вам нужно создать новую подписку, чтобы увидеть весь «массив», но, тем не менее, это интересный мысленный эксперимент.
const subject: ReplaySubject<number> = new ReplaySubject<number>();
subject.next(1);
subject.next(2);
subject.next(3);
const transformed: Observable<number> = subject.pipe(
map(x => x * x)
);
transformed.pipe(first()).subscribe(x => console.log(x));
// log: 1
// log: 4
// log: 9
subject.next(9);
transformed.pipe(first()).subscribe(x => console.log(x));
// log: 1
// log: 4
// log: 9
// log: 81