[英]RxJS zip not working while forkJoin does
我想要实现的是(使用Angular 2 / Typescript):
可观察的A产生事件流。
对于可观察A的每个事件,进行8个不同的http调用。 (8个切换图)
在所有8个请求都返回之后,执行一些操作(订阅8个switchmap的zip)。
对可观察A的每个事件重复8个请求(由switchmap和zip处理)
代码:(完整代码位于https://plnkr.co/edit/44yqw0RYzC7v1TFACMx1 )
let source = Observable
.interval(5000)
.take(100);
let requests = [];
for(let i=0; i<8;i++) {
let request = source.switchMap(x=> http.get('https://jsonplaceholder.typicode.com/users/'+(i+1))).publish();
request.subscribe(res => console.log(res.json()));
requests.push(request);
}
Observable.zip(requests)
.subscribe(console.log("All requests completed"));
requests.forEach(r => r.connect());
问题是我的zip从未被调用过。 我用console.log'ged订阅了这8个switchmap的订阅,并且我得到的日志显示,每当Observable / stream A中有一个事件时,成功返回8个http调用。调试工具)
但是zip永远不会发出任何东西。
如果我尝试其他(不太理想)的方法:
代码:(完整代码位于https://plnkr.co/edit/GqQde1Ae2licBjtL0jcj )
let source = Observable
.interval(5000)
.take(100);
source.subscribe(x=> {
console.log(x);
let requests = [];
for(let i=0; i<8;i++) {
let request = http.get('https://jsonplaceholder.typicode.com/users/'+(i+1)).publish();
request.subscribe(res => console.log(res.json()));
requests.push(request);
}
Observable.forkJoin(requests)
.subscribe(console.log("All requests completed"));
requests.forEach(r => r.connect());
});
这可行。 但是有一个明显的陷阱,我每次发出Observable A时都会创建8 + 1个嵌套的Observable / subscription。
(在两种情况下,我都使用发布/连接共享/重复使用订阅,但是即使没有订阅,问题仍然存在)
如果您使用多个参数正确调用zip
并传递一个要订阅的函数(而不是未定义的console.log的结果),则第一个示例将起作用。 演示
Observable.zip(...requests) // <-- spread this
.subscribe(() => console.log("All requests completed")); // <-- pass a function
requests.forEach(r => r.connect());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.