我在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之后放一个水龙头,我将得到预期的返回值。但是我的解析器永远无法解析? (或者发出了错误的消息?我无法确定。)
答案 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)
);