如何按顺序订阅并仅返回RxJS中最后一个可观察值?

时间:2019-10-18 21:45:51

标签: angular rxjs concatmap

我在Angular路线解析器中,想返回一个可观察的物体。

我需要依次订购多个异步过程

A => B(a)=> C(b)

C依赖于B,B依赖于A。A必须先完成,然后是B,然后是C,但我只希望使用C中的值来引起路由解析。

我尝试了两种不同的方法:

return A.pipe(
  concatMap(a => 
    B(a).pipe(
      concatMap(b => 
        C(b).pipe((c) => c); // also tried of(c)
      )
    )
  )
);

我也尝试过

return A.pipe(
  concatMap(a => {
    return B(a).pipe(map(b => {a: a, b: b});
  ),
  concatMap({a, b} => {
    return C(b);
  )
);

我如何订阅A,然后订阅B,然后订阅C ...,然后仅从最内部的可观察值中获取值?

如果在我的最后一个concatMap之后放一个水龙头,我将得到预期的返回值。但是我的解析器永远无法解析? (或者发出了错误的消息?我无法确定。)

2 个答案:

答案 0 :(得分:2)

如果链中的可观察对象之一从未完成(例如路线参数或查询参数),则会终止整列火车。

switchMap应该这样做:

A.pipe(
    switchMap(B), // which is more or less the same as `switchMap(a => B(a))`
    switchMap(C),
).subscribe(//...

答案 1 :(得分:1)

路由解析器需要完成,Angular Router才能继续。路线警卫也一样。添加一个接受发射的运算符,例如take(1)或first()并完成运算,将解决此问题。

return A.pipe(
  concatMap(a => {
    return B(a).pipe(map(b => {a: a, b: b});
  ),
  concatMap({a, b} => {
    return C(b);
  ),
  take(1)
);