3 回答
TA贡献1827条经验 获得超9个赞
我知道你有 aserviceOne
和 a serviceTwo
。并且您想serviceTwo
使用从 检索到的数据进行调用serviceOne
。
使用 rxjs switchMap您可以将一个可观察值通过管道传输到另一个可观察值中。
handler(): void {
this.serviceOne
.createDirectory(this.path)
.pipe(
switchMap(serviceOneResult => {
// transform data as you wish
return this.serviceTwo.methodCall(serviceOneResult);
})
)
.subscribe({
next: serviceTwoResult => {
// here we have the data returned by serviceTwo
},
error: err => {},
});
}
如果您不需要从serviceOne
到传递数据serviceTwo
,但需要它们一起完成,则可以使用 rxjs forkJoin。
handler(): void {
forkJoin([
this.serviceOne.createDirectory(this.path),
this.serviceTwo.methodCall()
])
.subscribe({
next: ([serviceOneResult, serviceTwoResult]) => {
// here we have data returned by both services
},
error: err => {},
});
}
TA贡献2065条经验 获得超14个赞
使用aysncandawait你可以这样做:
async handler(): void {
await this.serviceNAme
.createDirectory(this.path)
.pipe(
finalize(() => {
this.someProperty = false;
})
)
.subscribe(
(data) => console.log(data),
(error) => console.error(error.message)
);
// Do second api call
}
TA贡献1836条经验 获得超5个赞
有一些说法可以做到这一点:
场景#1
您的两个服务 api 调用是独立的,您只想调用一个,然后调用下一个
const serviceCall1 = this.serviceName.createDirectory(this.path);
const serviceCall2 = this.serviceName.createDirectory(this.otherPath);
concat(serviceCall1 , serviceCall2).subscribe({
next: console.log,
error: err => console.error(err.message),
complete: () => console.log("service call 1&2 complete")
});
场景#2
您的两个调用相互依赖,因此您需要第一个调用的结果才能开始第二个调用
this.serviceName.getDirectoryRoot().pipe(
switchMap(root => this.serviceName.createDirectoryInRoot(root, this.path))
).subscribe({
next: console.log,
error: err => console.error(err.message),
complete: () => console.log("service call 1 used to create service call 2, which is complete")
});
您将需要方案 # 2,因为这样做,第一次调用中的错误将意味着没有结果发送到switchMap,并且永远不会进行第二次调用。
添加回答
举报