typescript - Kombinerede pipelbare operatorer med RxJS/Angular
Er det muligt (jeg kan ikke finde noget dækkende om dette) at kombinere flere pipable operatorer i én funktion, så jeg kan pipe det og genbruge det i en anden metode også?
Her er sagen:
public ngOnInit(): void {
this.route.url
.pipe(
switchMap( (ids: UrlSegment[]) => /* http call */),
tap(result => /* setting a variable within a service */),
tap(result => /* some more manipulating and logic */),
map(result => /* setting a _this_ variable */)
)
.subscribe( () => {
/* some other async tasks, which depend on _this_ variables */
this.cdr.detectChanges();
});
}
Hvordan udtrækker jeg alt inden for pipe(), så jeg kan kalde den samme kæde af operatorer fra en anden metode, som ville have brug for at udføre det samme http-kald og efterfølgende logik og manipulation?
Hvad jeg prøver at opnå er:
this.route.url
.pipe(
this.combinedPipableMethod(url: UrlSegment[])
)
.subscribe()
Svar #1
Du kan bruge rxjs pipe (Bemærk, det er en selvstændig funktion, ikke en metode af Observable) funktion til at kombinere en række operatorer til én genanvendelig operator.
import { pipe } from "rxjs";
const customPipable = pipe(
switchMap( (ids: UrlSegment[]) => /* http call */),
tap(result => /* setting a variable within a service */),
tap(result => /* some more manipulating and logic */),
map(result => /* setting a _this_ variable */)
)
this.route.url
.pipe(customPipable)
.subscribe()
Her er en artikel om det
Svar #2
Du kunne udtrække en metode:
getData(ids: UrlSegment[]) {
return this.http.get(/* url construction logic */)
.pipe(
tap(result => /* setting a variable within a service */),
tap(result => /* some more manipulating and logic */),
map(result => /* setting a _this_ variable */)
);
}
Og så switchMap til det:
public ngOnInit(): void {
this.route.url
.pipe(
switchMap(this.getData),
)
.subscribe( () => {
/* some other async tasks, which depend on _this_ variables */
this.cdr.detectChanges();
});
}
Ellers kunne du lave en brugerdefineret operator, men det virker som overkill til dette formål:
const combinedPipableMethod = () => {
return source => defer(() => {
return source.pipe(
switchMap((ids: UrlSegment[]) => /* http call */),
tap(result => /* setting a variable within a service */),
tap(result => /* some more manipulating and logic */),
map(result => /* setting a _this_ variable */)
)
})
}
public ngOnInit(): void {
this.route.url
.pipe(
combinedPipableMethod(),
)
.subscribe( () => {
/* some other async tasks, which depend on _this_ variables */
this.cdr.detectChanges();
});
}
