簡體   English   中英

RxJS:如何讓一個Observer處理多個Observables?

[英]RxJS: How to have one Observer process multiple Observables?

我正在使用一個調用我實現的函數的框架。 我希望將此函數的參數轉換為Observable,並通過一系列Observers發送。 我以為我可以使用一個主題,但它沒有像我預期的那樣表現。

為了澄清,我有類似下面的代碼。 我認為下面的Option 1可行,但到目前為止,我正在為Option 2做好准備,這似乎不是慣用語。

var eventSubject = new Rx.Subject();
var resultSource = eventSubject.map(processEvent);
var subscription = resultSource.subscribe(
    function(event) {
        console.log("got event", event);
    },
    function(e) {
        log.error(e);
    },
    function() {
        console.log('eventSubject onCompleted');
    }
);

// The framework calls this method
function onEvent(eventArray) {

   var eventSource = Rx.Observable.from(eventArray);

   // Option 1: I thought this would work, but it doesn't
   // eventSource.subscribe(eventSubject);

   // Option 2: This does work, but its obviously clunky
  eventSource.subscribe(
      function(event) {
          log.debug("sending to subject");
          eventSubject.onNext(event);
      },
      function(e) {
          log.error(e);
      },
      function() {
          console.log('eventSource onCompleted');
      }
  );
}

正如Brandon已經解釋的那樣,將eventSubject訂閱到另一個observable意味着將eventSubjects onNext,onError和onComplete訂閱到onNext,onError和onComplete上的observable。 從您的示例中,您似乎只想訂閱onNext。

第一個eventSource完成/錯誤后,您的主題完成/錯誤 - 您的eventSubject正確地忽略后續eventSoures對其發出的任何進一步的onNext / onError。

有多種方法只能訂閱任何eventSource的onNext:

  1. 僅手動訂閱onNext。

     resultSource = eventSubject .map(processEvent); eventSource.subscribe( function(event) { eventSubject.onNext(event); }, function(error) { // don't subscribe to onError }, function() { // don't subscribe to onComplete } ); 
  2. 使用一個只處理訂閱eventSources onNext / onError的運算符。 這就是布蘭登建議的。 請記住,這也訂閱了eventSources onError,在您的示例中您似乎並不想要它。

     resultSource = eventSubject .mergeAll() .map(processEvent); eventSubject.onNext(eventSource); 
  3. 對於eventSources onError / onComplete,使用不調用eventSubjects onError / onComplete的觀察者。 您可以簡單地將eventSubjects onComplete覆蓋為臟黑客,但最好是創建一個新的觀察者。

     resultSource = eventSubject .map(processEvent); var eventObserver = Rx.Observer.create( function (event) { eventSubject.onNext(event); } ); eventSubject.subscribe(eventObserver); 

只是當您將整個Subject訂閱到一個observable時,您最終會向該Subject訂閱該observable的onComplete事件。 這意味着當觀察完成時,它將完成您的主題。 因此,當您獲得下一組事件時,它們什么也不做,因為主題已經完成。

一個解決方案就是你所做的。 只需將onNext事件訂閱到主題即可。

第二種解決方案,可以說更像“rx like”,將輸入數據視為可觀察的可觀察數據,並使用mergeAll展平這個可觀察流:

var eventSubject = new Rx.Subject(); // observes observable sequences
var resultSource = eventSubject
  .mergeAll() // subscribe to each inner observable as it arrives
  .map(processEvent);
var subscription = resultSource.subscribe(
    function(event) {
        console.log("got event", event);
    },
    function(e) {
        log.error(e);
    },
    function() {
        console.log('eventSubject onCompleted');
    }
);

// The framework calls this method
function onEvent(eventArray) {

   var eventSource = Rx.Observable.from(eventArray);
   // send a new inner observable sequence
   // into the subject
   eventSubject.onNext(eventSource);
}

更新: 這是一個運行的例子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM