2017-02-06 14 views
2

我有一個二維數組BehaviorSubject<number>s。出於調試目的,我希望一旦所有數組單元都發出值,就以格式化的方式寫入值。所以我寫了這個:Observable.zip不會調用subscribe.next,如果源以數組形式給出

Observable.zip(universe.map(row => Observable.zip(row))) 
     .takeUntil(stopper) 
     .subscribe(u => 
      console.log(`[\n\t[${u.map(r => r.toString()).join("],\n\t[")}]\n]`)) 

沒有寫。而且這已經行不通了:

Observable.zip(universe[0]) 
     .takeUntil(stopper) 
     .subscribe(u => console.log(`1[${u.toString()}]`)) 

但這些工作之後(該數組有5列):

Observable.zip(universe[0][0], universe[0][1], universe[0][2], universe[0][3], universe[0][4]) 
     .takeUntil(stopper) 
     .subscribe(u => console.log(`2[${u.toString()}]`)) 

    Observable.zip(Observable.zip(Observable.zip(Observable.zip(universe[0][0], universe[0][1]), universe[0][2]), universe[0][3]), universe[0][4]) 
     .takeUntil(stopper) 
     .subscribe(u => console.log(`3[${u.toString()}]`)) 

而且我已經考慮.zipAll()運算符,但沒有文件吧。

這可能是Observable.zip()代碼中的一個錯誤,因爲它在代碼輔助中顯示ArrayLike<BehaviorSubject<number>>作爲可能的參數類型。

那麼,有沒有其他辦法讓這個功能?我怎樣才能得到一次寫下來所有的值被重新分配,數組值不知道過程的實際尺寸是多少?

回答

2

重要的是,zip()運算符不採用Observable數組,而是使用解壓縮的一系列Observables。

這就是爲什麼Observable.zip([obs1, obs2, obs3])不起作用。

Observable.zip(obs1, obs2, obs3)的作品。

當我們不知道universe是什麼時,無法幫助您。從你所擁有的,現在好像你可以使用destructuring assignment(假設你使用ES6或打字稿):

Observable.zip(...universe[0]); 

我不知道有什麼計劃與zipAll()但現在它只是callls zip()

+0

謝謝你的提示前面回答。 univer的定義是這樣的:'let universe:BehaviorSubject [] []'。關於錯誤的參數沒有任何編譯或運行時錯誤。我會嘗試使用apply()或call()來滿足我的需求。 – koducu

+0

我已經在zip.d.ts中找到了這個:'export declare function zipStatic (array:ObservableInput []):Observable ' – koducu

+0

@koducu實際上你應該只關心'zipProto',你可以在這裏看到https:/ /github.com/ReactiveX/rxjs/blob/master/src/add/operator/zip.ts和https://github.com/ReactiveX/rxjs/blob/master/src/operator/zip。ts#L13 – martin

0

由於[email protected] Observable.zip()函數實現不承認Observable陣列即使export declare function zipStatic<T>(array: ObservableInput<T>[]): Observable<T[]>;export declare function zipStatic<T>(...observables: Array<ObservableInput<T>>): Observable<T[]>;函數聲明發生在rxjs/operator.zip.d.ts(什麼是這個聲明之間的差異超出了我的Type/Javascript知識)。它只是將傳遞給它的參數對象成員泵到本地數組,並且如果傳遞數組,則從不平坦化它們。甚至不檢查參數類型來提高情況。

上面收到@ martin的回答後,我把電話改爲Observable.zip()Observable.zip.apply(null, observable_array)然後問題就解決了。但是.zip()應該接受以幫助可讀性和堅持上述函數聲明Observable S(至少一個)陣列。

相關問題