Array.map 转换单个数组的每个元素。
console.log( [ 1, 2, 3 ].map(x => x * x) )
// log: [ 1, 4, 9 ]
一般来说,RXJS Observables 更像是一个数据流,但是每个数据都是它自己的实体。
您可以选择将数组存储在 Observable 中,但每个数组仍被视为单个实体。每次您拨打Subject#next 时,您都会提供一个全新的数组。在这种情况下,RXJS 中没有与Array#push 等效的方法,因为 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