2016-12-28 42 views
3

長時間潛伏者 - 第一次海報。 這是很多理論,所以請耐心等待。瞭解觀察員和subscibers angular2

我正在精神模擬觀察者,觀察者和訂戶(rxjs和angular2)的想法,並希望確保我處於正確的軌道上。

我目前將觀察者理解爲「可以觀察和採取行動的事件流」。數組和請求可以被轉換爲可觀察的,以便觀察者可以訂閱它們,並且當事件被觸發時可以作用於該事件或可觀察數據。

我看到訂閱者是一種觀察者類型,它可以通過3個可能的處理函數觀察可觀察值:onNext,onComplete和onError。

我知道這些可以在不同的類中,只要訂閱者可以訪問觀察到訂閱。

請讓我知道這是否是一個準確的描述。

如果這是真的,我很好奇如何創建一個可觀察數組,如下: 當新項目添加到數組中時,我該如何訂閱該事件並對其執行操作?

我已經嘗試通過創建一個數組,填充鼠標事件並嘗試將此數組作爲Observable進行投射。

這失敗了,但我能夠創建一個可觀察的主題,用next()推入新項目並訂閱訂閱者的下一個事件(我不知道它是什麼類型,所以我只是離開它因爲我無法讓編譯器接受我放入的任何東西)。

我的問題是:

1)是我觀察到的&觀察者/用戶的上述理解是否正確?

2)我可以創建一個標準數組,使其可觀察並聽取'添加'或'修改'事件嗎?

3)我上面提到的用戶類型是什麼?

this.mouseLocationSubscriber = this.mLocs$.subscribe(
     X => this.handleNext(X), 
     err => this.handleSubscriberError(err), 
     () => console.log('subscriber recd complete') 
); 

請:

  • ,如果這個職位是在錯誤的地方,幫我把它放在正確的位置

  • ,如果這個職位的格式不正確,幫助我瞭解如何格式化它的最佳可能性找到答案

  • 如果這篇文章是一些類似的代碼丟失理論家的騙局,幫我找到答案

  • 如果有其他任何事情,我應該團團圍住了,我已經準備好你乾草叉:----E

+0

這個問題,引用了項目的下列文件/回購應您需要進一步的方面: https://github.com/nathank000/angular2_observer_test/blob/master/src/app/service/mouse.service.ts –

回答

3

1) Is my above understanding of observable & observer/subscriber correct?

你是在正確的軌道上,沒有什麼,我可以考慮一個錯誤在這個定義上。也許我會改變的是,我會將觀察者/訂閱者合併成一個實體,因爲它們是完全相同的。另外,請記住Observables採用功能風格的編程方法:創建流時,只有觀察者調用.subscribe()才能執行任何操作。

人們經常會感到困惑的另一件事是使用onError。當流產生onError這意味着發生了不可恢復的崩潰:流被關閉,並且onNext將不會再被調用。當人們希望得到某種軟錯誤的,他們做的是調整可觀察的類型包括,如isSuccesfull:booleanerrors:Error[]

2) can I create a standard array, make it observable and listen to 'added' or 'modified' events?

不...觀測量不能使用魔法。從Rx.Observable您得到一些幫助方法將數組轉換爲Observable序列,但它們不是可觀察數組。想想看,你可以做一個可觀​​察的東西,你可以用Rx.Observable.create做,比如,一個可能實現的Rx.Observable.fromArray可能是:

function observableFromArray(array){ 
    return Rx.Observable.create((observer) => { 
     array.forEach((elm) => { 
      observer.onNext(elm); 
     }); 
     observer.onCompleted(); 
    }); 
} 

但你可以看到,當一個項目被推向陣列上,沒有辦法通知觀察者。

可以用來做某些事情的東西是Proxies,它允許你攔截在一個對象/數組中完成的操作......這有些急躁,所以不要在IE中專家太多的支持。

我認爲你最好的選擇是通過Subjects,如你所說。您可以創建自定義的「ObservableArray」(或嘗試使用Google搜索,也許有人已經這樣做了),觀察者可以訂閱它,生產者可以推送/刪除值。

3) what is the type of the subscriber that I mention above?

類型總是保留。如果您有Observable<MouseEvent>,則觀察者將是Observer<MouseEvent>。把它看作是發射MouseEvents的觀察者,以及接受MouseEvent的觀察者。

+0

謝謝你對驗證非常感興趣 - 我期待着觀察者的魔力,但它看起來非常像我將創建一個新的自定義觀察者對象並使用它來實現所需的「處理新數組元素」。 –

+0

至於用戶類型 - 當我將用戶鍵入訂閱者時: 'mLocs $:Subject ; mouseLocation訂閱者:訂閱者;' 我得到錯誤: '類型'訂閱'不可分配給類型'訂閱者'' –

+0

哦,對。 '.subscribe()'不返回訂閱者,而是訂閱。觀察者/訂閱者是獲取'onNext','onError'等的東西(你放在'.subscribe()'裏面),訂閱只是當你想停止接收消息時的一個對象(取決於實現,但通常是通過調用'subscription.dispose()') – olivarra1