使用forkJoin时Pipe中的订阅为何未被触发?
问题原因与解决方案
这是个典型的RxJS冷Observable特性导致的问题,我来给你拆解清楚:
核心问题:你没订阅经过pipe处理的Observable
RxJS里的Observable是冷流——只有当它被订阅的时候,内部的逻辑才会开始执行。看你的代码:
- 你给
obs1调用.pipe(map(...))后,这个操作返回了一个全新的Observable,但你既没把它存成变量,也没订阅它。 - 而你传给
forkJoin的还是原始的obs1,所以forkJoin订阅的是没经过map处理的原流,自然不会触发你写的console.log("map")逻辑。
两种修复方式
方式1:把pipe后的Observable赋值给变量,再传给forkJoin
const obs1 = ajax.getJSON("https://api.github.com/users/google").pipe( map(result => { console.log("map"); console.log(result); return result; }) ); forkJoin([obs1]) .subscribe(result => { console.log("forkJoin"); console.log(result); });
方式2:直接在forkJoin参数里对obs1做pipe处理
const obs1 = ajax.getJSON("https://api.github.com/users/google"); forkJoin([ obs1.pipe( map(result => { console.log("map"); console.log(result); return result; }) ) ]) .subscribe(result => { console.log("forkJoin"); console.log(result); });
额外提醒:forkJoin的前提条件
要注意forkJoin要求每个传入的Observable必须完成,否则它永远不会发出值。你的例子里用的ajax.getJSON是HTTP请求流,请求结束后会自动完成,所以没问题;但如果是像interval(1000)这种无限流,你需要用take(1)这类操作让它完成,比如:
forkJoin([ interval(1000).pipe(take(1), map(num => num * 2)) ]).subscribe(console.log);
内容的提问来源于stack exchange,提问作者Olivier Coste
相关产品推荐
相关产品推荐

