我可以找到大量关于链接两个呼叫的示例,但是我有3个http呼叫使用前一个呼叫中的数据一个接一个地进行。
我有两个人正在使用flatMap
这样:
call1(params)
.flatMap((res1)=> {
return call2(params)
.subscribe(r=>r...)
但是对于三个电话我正在尝试相同的事情,但我不认为你可以将flatMaps连在一起吗?
call1(params)
.flatMap((res1)=> {
return call2(params)
.flatMap((res2)=> {
return call3(params)
.subscribe(r=>r...)
我收到一条错误消息,说订阅不能分配给类型观察输入。每个call1都从http操作中返回一个observable。
有人能指出我正确的方向吗?
真的很感激它,因为它让我疯了!
感谢 保罗
答案 0 :(得分:12)
您可以根据需要多次使用flatMap
。但是,每次都必须返回一个Observable。
E.g。
myFunc() // returns an Observable of type X
.flatMap((res: X) => {
// returns an Observable of type Y
})
.flatMap((res: Y) => {
// returns an Observable of type Z
})
.flatMap((res: Z) => {
// returns an Observable of type Q
})
.subscribe((res: Q) => {
// some logic
});
RxJs已更改
从RxJs v5.5开始,出现了Pipeable
个运营商。我们不再将某些运算符原型化为Observable
,而是导入它们并按如下方式使用它们:
import { flatMap } from 'rxjs/operators';
myFunc() // returns an Observable of type X
.pipe(
flatMap((res: X) => {
// returns an Observable of type Y
}),
flatMap((res: Y) => {
// returns an Observable of type Z
}),
flatMap((res: Z) => {
// returns an Observable of type Q
})
).subscribe((res: Q) => {
// some logic
});
答案 1 :(得分:6)
flatMap()
期望Observable
作为返回值,但您返回Subscription
。
修复如下:
call1(params)
.flatMap((res1)=> {
return call2(params);
})
.flatMap((res2)=> {
return call3(params);
})
.subscribe(r=>r...)
附加说明:
这些请求仍将在彼此之后执行,而不是并行执行。如果您想提高速度,可以使用Observable.forkJoin()
:
Observable.forkJoin(
call1(params),
call2(params),
call3(params)
).subscribe((responses) => {
// responses[0] -> response of call1
// responses[1] -> response of call2
// responses[2] -> response of call3
})