Angular 2将三个http调用与flatMap相结合? RxJs?

时间:2017-06-22 11:52:13

标签: angular http rxjs

我可以找到大量关于链接两个呼叫的示例,但是我有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。

有人能指出我正确的方向吗?

真的很感激它,因为它让我疯了!

感谢 保罗

2 个答案:

答案 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
})