我想要達到這是(與角2 /打字稿):RxJS ZIP不工作時forkJoin做
而觀察到的生產活動流。
對於Observable A的每個事件,進行8個不同的http調用。 (8個switchmaps)
在所有8個請求返回後,做一些事情(訂閱8個switchmaps的zip)。
重複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());
問題是我的拉鍊永遠不會被召喚。我console.log'訂閱了每個8個switchmaps,並且我收到日誌,顯示每次有Observable/stream A中的事件時,都會成功返回8個http調用。(也可以看到在網絡選項卡中返回的8個調用的調試工具)
但是zip從不發射任何東西。
如果我嘗試不同的(不太理想)的方法:
- 訂閱而觀察到的一次(不switchmap)
- 在訂閱創建8個可觀測量每個HTTP調用,並訂閱ForkJoin的8個觀測量
代碼:(在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());
});
This works。但是每當Observable A發出時,我都會創建8 + 1個嵌套的observables /訂閱。
(在我使用發佈/連接到共享/重用訂閱,但即使沒有它的問題存在兩種情況)
顯示一些代碼。 –
@RobinDijkhof新增了它。花了一些時間來從我的應用程序中提取主要邏輯 – flak37