angular - Extrahera rörbar operator som funktion i RXJS


Jag har följande kod

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

Nu upprepas denna kod i exhaustMap i flera komponenter och jag skulle vilja extrahera den som en extern funktion.

Jag har försökt följande

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

Men sedan vet jag inte hur jag ska koppla in det i den ursprungliga koden (om funktionens kod själv är korrekt)

Svar #1

Du skapar i princip en anpassad operator. Du är på rätt spår. Du måste göra en funktion som tar en observerbar och returnerar en ny.

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

Nu kan du använda myExhaust istället för exaustMap i ditt rör.

Svar #2

Din utility verkar bra och här är hur du kan skicka utilityn till pipen:

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

Här är det fungerande exemplet