У меня есть предмет, затем я применяю к нему оператор map(x => x/*not the real function*/)
. Но оператор карты имеет некоторые побочные эффекты, в некоторых случаях он выдает новое значение.
const sub = new Subject();
const emits = [];
const mapped = [];
const emit$ = sub.asObservable().subscribe(x => emits.push(x));
const data$ = sub.asObservable().pipe(
map(x => {
return x;
}),
tap(x => mapped.push(x)),
tap(x => {
if (x % 2 === 0) {
sub.next(2333);
}
if (x === 2333) {
sub.next(1111);
}
})
);
const datas = [];
data$.subscribe(x => {
datas.push(x);
});
sub.next(1);
sub.next(2);
setTimeout(() => {
console.log('emits: ',emits);
console.log('mapped: ', mapped);
console.log('datas: ', datas);
}, 10);
когда входная последовательность равна [1, 2], подписчик субъекта получит [1, 2, 2333, 1111], но подписчик сопоставленного наблюдаемого получит [1, 1111, 2333, 2].
ОБНОВИТЬ:
Я перемещаю побочные эффекты в оператор tap
и сохраняю сопоставленные выбросы в массив, после чего результат становится таким:
emits: [1, 2, 2333, 1111]
mapped: [1, 2, 2333, 1111]
datas: [1, 1111, 2333, 2]
Вот вопросы:
- Это правильное поведение?
- Должен ли я выделять новое значение в операторах?