Существуют ли операторы RxJS, которые изменяют наблюдаемое?

Этот вопрос предназначен для обучения, а не для решения конкретной проблемы (при необходимости переместите его в соответствующий раздел).

Я изучаю операторы конвейера в библиотеке RxJS. На этом сайте (https://rxjs.dev/guide/operators) различаются конвейерные операторы. и операторы-создатели.

Он определяет конвейерные операторы следующим образом:

Оператор конвейера - это функция, которая принимает на вход Observable и возвращает другой Observable. Это чистая операция: предыдущий Observable остается неизменным.

И он определяет операторы-создатели следующим образом:

Операторы создания - это другой тип операторов, которые можно вызывать как отдельные функции для создания нового объекта Observable. Например: of (1, 2, 3) создает наблюдаемое, которое будет генерировать 1, 2 и 3 один за другим.

Но это заставляет меня задуматься: существует ли такой оператор, как тот, который ДЕЙСТВИТЕЛЬНО изменяет наблюдаемое, которое он получает в качестве входных данных, и возвращает его в качестве выходных данных? Ничего подобного не встречал. Есть ли причина, по которой такого оператора не существует? К какому нежелательному поведению может привести такой оператор?


person gib65    schedule 29.06.2021    source источник
comment
Rx - чистая библиотека. Ни один из конвейерных операторов не изменяет предыдущее наблюдаемое. Если бы такой оператор существовал, он мог бы непредсказуемым образом разрушать существующие конвейеры, что чрезвычайно затруднило бы диагностику ошибок.   -  person Enigmativity    schedule 29.06.2021
comment
Я даже не думаю, что можно создать оператор, который изменил бы его исходный Observable. Возможно, если бы каждое излучение было объектом, и вы бы изменили один и тот же экземпляр в своем операторе, он бы сделал что-то похожее на то, что вы просите (?).   -  person martin    schedule 29.06.2021


Ответы (1)


Вы можете рассматривать конвейерную операцию как последовательность выполнения функции, в большинстве случаев нет необходимости изменять восходящую функцию. Что нас интересует, так это преобразование данных и добавление настраиваемой операции по мере продвижения по потоку.

fn(fn2(fn3(...)))

если в любом случае вы хотите изменить поведение восходящего потока, наблюдаемый восходящий поток должен быть спроектирован таким образом, чтобы разрешить такой случай, например, использовать фабрику функций, чтобы позволить пользователю добавить промежуточное ПО

e.g

const interceptor=()=>{...}
const getUpstreanFn=(middleware)=>(param)=>{ middleware()......}
const upstreamFn=getUpstreamFn(middleware)
person Fan Cheung    schedule 29.06.2021
comment
Было бы следующим хорошим примером нежелательного поведения, если бы операторы изменили исходную наблюдаемую? obs.subscribe(x => console.log('one:', x)); obs.pipe(map(x => x*2)).subscribe(x => console.log('two:', x)); obs.subscribe(x => console('three:', x)); Скажем, оператор карты изменил исходную наблюдаемую. И скажем, что наблюдаемый испустил значение 1. Тогда на выходе может быть one: 1 two: 2 three: 2. IOW, как только оператор карты запускается, он умножает исходное значение на 2, и последующие подписки получат измененное значение (не обязательно в указанном мной порядке). - person gib65; 06.07.2021
comment
map здесь не изменяет исходное наблюдаемое - obs. Это добавление, а не изменение. допустим, если мы будем работать вместе над этим фрагментом кода, и мне не нужны ваши дополнительные map в моей логике, я могу просто напрямую использовать obs для создания собственного потока, например obs.pipe(switchMap(...)).subscribe(), obs останется нетронутым. - person Fan Cheung; 06.07.2021