Эквивалент RxJS switchMap в ReactiveX/Rx.NET

В RxJS есть функция switchMap. Есть ли аналог в ReactiveX/Rx.NET? Я не вижу его в документации по преобразованию.


person wonderful world    schedule 31.03.2017    source источник


Ответы (3)


Изменить

switch является эквивалентом. http://reactivex.io/documentation/operators/switch.html

Короче говоря, switchMap и switch отменят все предыдущие потоки, а flatMap — нет.

person Tyler Jennings    schedule 31.03.2017
comment
flatMap и switchMap определенно не эквивалентны - person schacki; 31.01.2018
comment
switchMap отменяет предыдущие потоки, а flatMap — нет. - person Ibrahim ben Salah; 12.12.2018

В Rx.NET нет единого SwitchMany, эквивалентного switchMap в Rx.js. Вам нужно использовать отдельные функции Select и Switch.

Observable.Interval(TimeSpan.FromMinutes(1))
    .Select(_ => Observable.Return(10))
    .Switch()

Документация: https://msdn.microsoft.com/en-us/library/hh229197(v=vs.103).aspx

person MorleyDev    schedule 08.09.2017

Из http://reactivex.io/documentation/operators/switch.html

Оператор Switch подписывается на Observable, который испускает Observables. Каждый раз, когда он наблюдает за одним из этих испускаемых Observable, Observable, возвращаемый Switch, отписывается от ранее выпущенного Observable, начинает испускать элементы из последнего Observable.

Как указал MorleyDev, реализация .NET https://docs.microsoft.com/en-us/previous-versions/dotnet/reactive-extensions/hh229197(v=vs.103), поэтому эквивалентом switchMap RxJS в Rx.NET является комбинация операторов Switch и Select:

// RxJS
observableOfObservables.pipe(
    switchMap(next => transform(next))
    ...
)

// RX.Net
observableOfObservables
    .Switch()
    .Select(next => transform(next))
    ...
person vimant    schedule 08.10.2018
comment
Я не думаю, что у вас есть правильный порядок. Switch происходит с внутренними наблюдаемыми, но у вас их нет, пока вы не вызовете Select. Приведенный выше ответ также имеет их наоборот. - person PhilT; 22.12.2019