2017-07-04 57 views
0

我想要達到這是(與角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 /訂閱。

(在我使用發佈/連接到共享/重用訂閱,但即使沒有它的問題存在兩種情況)

+1

顯示一些代碼。 –

+0

@RobinDijkhof新增了它。花了一些時間來從我的應用程序中提取主要邏輯 – flak37

回答

1

你,如果你正確地調用zip有多個參數,並通過一個函數第一個例子會工作訂閱(而不是未定義的console.log的結果)。 Demo

Observable.zip(...requests) // <-- spread this 
    .subscribe(() => console.log("All requests completed")); // <-- pass a function 

requests.forEach(r => r.connect()); 
+0

This Works!謝謝。但我很好奇爲什麼forkJoin,combineLatest等工作沒有散佈論證。 (以及爲什麼訂閱直接與他們console.log(),而不通過一個lambda /箭頭函數)? – flak37

+1

@ flak37「爲什麼forkJoin,combineLatest等工作沒有傳播」ad-hoc多態性。當第一個參數是數組時,它們有特殊的處理。 [code](https://unpkg.com/[email protected]/observable/ForkJoinObservable.js) –

+1

@ flak37「還有爲什麼訂閱直接與console.log()一起工作」它實際上並不工作。簡單的證明:https://plnkr.co/edit/k0XW99xu8WLdMY3ecOl9?p=preview –