繁体   English   中英

RxJS zip在forkJoin起作用时不起作用

[英]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永远不会发出任何东西。


如果我尝试其他(不太理想)的方法:

  • 一次订阅Observable A(而非切换图)
  • 在订阅中,为每个http调用创建8个Observable,并订阅8个Observable中的ForkJoin

代码:(完整代码位于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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM