J'ai le code suivant
myExhaust(obs: Observable<any>): Observable<{ someValue: SomeClass }> {
return obs.pipe(
exhaustMap((val) => {
// do some stuff
return of({someValue})
})
);
}
Maintenant, ce code dans exhaustMap est répété dans plusieurs composants et j'aimerais l'extraire en tant que fonction externe.
J'ai essayé ce qui suit
this.form.valueChanges.pipe(
take(1),
map(val => // doSomething),
exhaustMap(val =>
// someInner observable logic
return of({someValue})
)
).subscribe(finalVal => doSomething());
Mais alors je ne sais pas comment le brancher dans le code d'origine (que si le code de fonction lui-même est correct)
3 Réponses :
Vous créez essentiellement un opérateur personnalisé. Tu es sur la bonne piste. Vous devez créer une fonction qui prend une observable et en renvoie une nouvelle.
function myExhaust<T>(): MonoTypeOperatorFunction<T> {
return input$ => input$.pipe(
exhaustMap((val) => {
// do some stuff
return of({someValue})
}))
}
Vous pouvez maintenant utiliser myExhaust au lieu d'exaustMap dans votre pipe.
Qu'en est-il du passage des paramètres à l'opérateur personnalisé?
Vous pouvez créer une fonction partagée standard avec cette logique et l'utiliser dans n'importe quel composant:
// 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());
Mais si vous devez combiner cette logique uniquement avec l'opérateur exhaustMap , vous avez besoin d'un opérateur canalisable personnalisé.
Votre utilitaire semble bien et voici comment vous pouvez le transmettre au tube:
this.form.valueChanges.pipe( take(1), myExhaust, ).subscribe(finalVal => doSomething());