Извлечь конвейерный оператор как функцию в RXJS - PullRequest
0 голосов
/ 14 июля 2020

У меня есть следующий код

this.form.valueChanges.pipe(
    take(1),
    map(val => // doSomething),
    exhaustMap(val => 
      // someInner observable logic
      return of({someValue})
    )
).subscribe(finalVal => doSomething());

Теперь этот код в exhaustMap повторяется в нескольких компонентах, и я хотел бы извлечь его как внешнюю функцию.

I пробовали следующее

  myExhaust(obs: Observable<any>): Observable<{ someValue: SomeClass }> {
    return obs.pipe(
      exhaustMap((val) => { 
           // do some stuff
           return of({someValue})
      })
    );
  }

Но тогда я не знаю, как вставить его в исходный код (что, если сам код функции правильный)

Ответы [ 3 ]

2 голосов
/ 14 июля 2020

Вы в основном создаете собственного оператора. Ты на правильном пути. Вам нужно создать функцию, которая принимает наблюдаемый объект и возвращает новый.

function myExhaust<T>(): MonoTypeOperatorFunction<T> {
    return input$ => input$.pipe(
       exhaustMap((val) => { 
           // do some stuff
           return of({someValue})
       }))
}

Теперь вы можете использовать myExhaust вместо exaustMap в своем канале.

1 голос
/ 14 июля 2020

Ваш utility кажется нормальным, и вот как вы можете передать утилиту в канал:

this.form.valueChanges.pipe(
take(1),
 myExhaust,
).subscribe(finalVal => doSomething());

Вот рабочий пример

0 голосов
/ 14 июля 2020

Вы можете создать обычный общий function с этим c logi и использовать его в любых компонентах:

// set appropriate generic types for your case
// it's just an example 
export function fun<T>(data: T): Observable<T> {
  // do your stuff
  return of<T>(data);
}

// usage
this.form.valueChanges
  .pipe(
    take(1),
    map(val => // doSomething),
    exhaustMap(val => fun(val))
  )
  .subscribe(finalVal => doSomething());

Но если вам нужно объединить этот logi c только с оператором exhaustMap вам нужен пользовательский конвейерный оператор.

...