rxjs - Angular:如何等待 Observable 函数,调用另一个 returns Observable 函数?
rxjs - Angular: How to wait for an Observable function, to call another function that returns an Observable?
我在一个服务中有 2 个 API 调用,每个 return 一个 Observable,在我的组件中我有一些条件,如果为真,我必须调用这两个函数,但我需要等待 get() 调用,这样我就可以使用 get 调用中的 return 参数执行 post 函数。如果为假,我只想用已经定义的参数调用 post 函数。
服务:
get(id: string) {
return this.http.get<any>('get path');
}
post(data: data) {
return this.http.post<any>('post path', {data: data});
}
组件:
execute() {
if (condition) {
this.service.get(id).subscribe( (res) =>
// ...
this.data = res.data;
post(data).subscribe(() => // do stuff...);
);
} else { post(data).subscribe(() => // do stuff...); }
}
我不想重复 post 调用的代码,或者如果根本不可能,只是不要在另一个 subscribe() 中使用 subscribe()。我怎样才能做到这一点?没有异步等待。
提前致谢
您可以使用 RxJS switchMap
operator to map from one observable to another (in your case GET to POST) and use RxJS iif
函数有条件地 return 一个可观察对象。
尝试以下方法
execute() {
const getPost$ = this.service.get(id).pipe(
switchMap((res: any) => {
this.data = res.data;
return this.service.post(data);
})
);
iif(
() => condition,
getPost$,
this.service.post(data)
).subscribe(
(res: any) => {
// handle response
},
(error: any) => {
// handle error
}
);
}
另一种解决方案可能如下所示:
const source$ = condition
? this.service.get(id) // Get new data
: of(this.data); // Use already defined data
source$.pipe(
concatMap(data => this.service.post(data)),
)
我在一个服务中有 2 个 API 调用,每个 return 一个 Observable,在我的组件中我有一些条件,如果为真,我必须调用这两个函数,但我需要等待 get() 调用,这样我就可以使用 get 调用中的 return 参数执行 post 函数。如果为假,我只想用已经定义的参数调用 post 函数。
服务:
get(id: string) {
return this.http.get<any>('get path');
}
post(data: data) {
return this.http.post<any>('post path', {data: data});
}
组件:
execute() {
if (condition) {
this.service.get(id).subscribe( (res) =>
// ...
this.data = res.data;
post(data).subscribe(() => // do stuff...);
);
} else { post(data).subscribe(() => // do stuff...); }
}
我不想重复 post 调用的代码,或者如果根本不可能,只是不要在另一个 subscribe() 中使用 subscribe()。我怎样才能做到这一点?没有异步等待。
提前致谢
您可以使用 RxJS switchMap
operator to map from one observable to another (in your case GET to POST) and use RxJS iif
函数有条件地 return 一个可观察对象。
尝试以下方法
execute() {
const getPost$ = this.service.get(id).pipe(
switchMap((res: any) => {
this.data = res.data;
return this.service.post(data);
})
);
iif(
() => condition,
getPost$,
this.service.post(data)
).subscribe(
(res: any) => {
// handle response
},
(error: any) => {
// handle error
}
);
}
另一种解决方案可能如下所示:
const source$ = condition
? this.service.get(id) // Get new data
: of(this.data); // Use already defined data
source$.pipe(
concatMap(data => this.service.post(data)),
)