2016-04-21 80 views
1

我正在努力與RxJS。有關Observable的一些問題RxJS在調用onCompleted之後Observable是否清空數據數組?

  1. 在調用onCompleted之後Observable是否清空數據數組?
  2. 當我將兩個subscribe()方法鏈接在一起時出現錯誤「訂閱類型訂閱中不存在」。這是爲什麼?

    someObs.map(...)。認購(...)。認購(...)

  3. 有沒有一種方法來檢查可觀察到的數據數組數不訂閱?

  4. 如果Observable在發佈數據項後清除數據項,是否可以將新數據項重新填充到相同的可觀察實例中而不創建新數據項?如果是的話,怎麼樣?

+1

不知道的人,但2不工作,因爲#訂閱的'()的返回'是類型'Subscription',其中不呼籲'#方法訂閱()'。爲了這個工作,'#subscribe()'必須再次返回Observable,這實際上並不合理。您應該將'.subscribe()'調用移到他們自己的行,而不是將它們鏈接在一起。哦,對於#4,你可以使用[Subject](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/subjects.md)。 – dvlsg

+0

有用的信息+1 – Shawn

回答

1
  1. 號RxJS是函數式編程的近親,這意味着突變通常是一大禁忌。流數據的全部要點是避免狀態變化,這在許多方面是當今應用中許多麻煩的根源。

所有觀察對象都會包裝各種數據源類型,以便它們通過通用接口發出事件。因此Rx.Observable.fromArrayRx.Observable.fromPromise都會生成具有相同語義的Observable,唯一的區別是事件的數量和生成這些事件的時間。

  • Observables懶惰,所有花哨方法鏈接不會做任何事情,直到可觀察最終訂閱。因此,subscribe實際上就像是說「執行」或「去」,它將允許事件開始移動通過Observable。

  • 不知道你的「觀察數據陣」的意思,見點1.如果您通過數組可觀察到的,那麼你應該能夠檢查的

  • 一點也沒有大小」 t,但是在某種意義上,您可以通過簡單地重新訂閱來「重新填充」基於Array的Observable,這將開始再次發送事件的過程。正如dvlsg提到的,你也可以使用Subject來明確地將事件推送到觀察者,但在99%的情況下,它的使用可以並且應該避免,因爲它被用作柺杖以避免實際上成爲反應性

  • var source = Rx.Observable.fromArray([1, 2, 3, 4]); 
    
    //First subscription, prints all of the events from array 
    source.subscribe(x => console.log(x)); 
    
    //Second subscription, prints all the events *again* because 
    //this is a new subscription occurrence 
    source.subscribe(y => console.log(y)); 
    
    +0

    paulpdaniels,謝謝你在我心中清除了很多泥土的詳細解釋:) – Shawn

    +0

    我必須對第4點提出至少輕微的分歧。我同意,當你*可以*避免使用'Subject'時,你應該這樣做,但是有很多時候你會想要訂閱一個長期運行的變化,你需要從一個來源不直接支持'rxjs'。 'Subject'可能與'nodejs'中的'EventEmitter'關係更密切。我想你可以爭辯說,你應該在這些情況下使用'EventEmitter',然後訂閱*那*。 – dvlsg

    +0

    這裏是一些來自rxjs文檔的[閱讀](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/howdoi/eventemitter.md)。 – dvlsg