簡體   English   中英

如何使用 RxJS 運算符創建可觀察的自定義對象流

[英]How to create an observable stream of custom objects using RxJS operators

我目前有如下輸入

const config = {
  'mainA': { sub1: { name: 'test1'}, sub2: { name: 'test2'}},
  'mainB': { sub1: { name: 'test3'}, sub2: { name: 'test4'}}
};

我正在嘗試編寫一個函數 (createCustomObservable),它將使用標准 RsJS 運算符創建一個可觀察對象,如下所示

var observable = createCustomObservable(config);
observable.subscribe((x) => console.log(x));

控制台輸出應如下所示

{'mainA': 'test1'} -> {'mainA': 'test2'} -> {'mainB': 'test3'} ->  {'mainB': 'test4'} 

具有單一屬性的一系列對象

有誰知道如何使用 RxJS 運算符來實現這一點? 任何幫助將不勝感激。

您嘗試解決的主要問題是遍歷對象以獲取包含“名稱”字段的所有對象,並獲取它們的值。

沒有 Rx 運算符可以自動執行此操作,因此要完成此任務,您只需使用Rx.Observable.create - https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/創建.md

const config = {
'mainA': {
    sub1: {
        name: 'test1'
    },
    sub2: {
        name: 'test2'
    }
},
'mainB': {
    sub1: {
        name: 'test3'
    },
    sub2: {
        name: 'test4'
    }
}
};


function traverse(o, func) {
    for (var i in o) {
        func.apply(this, [i, o[i]]);
        if (o[i] !== null && typeof(o[i]) == "object") {
            //going on step down in the object tree!!
            traverse(o[i], func);
        }
    }
}

var source = Rx.Observable.create(function(observer) {

    traverse(config, function(key, value) {
        if (key == "name")
            observer.onNext(value);
    });

    observer.onCompleted();
    return function() {
        console.log('disposed');
    };
});

source.subscribe(function(next) {
    console.log(next);
})

示例: https : //jsbin.com/yolufovubi/edit?js,console

我們可以通過 Observable 構造函數創建一個新的流,你必須手動調用 next()、error() 和 complete() 函數。

function createCustomObservable(config) {
   return new Observable(
      observer => {
         try {
           observer.next(config)
        } catch(err) {
          observer.error(err);
       } finally {
         observer.complete();
      }
    })
 }

並以這種方式使用它

var observable = createCustomObservable(config);
observable.subscribe((x) => console.log(x));

暫無
暫無

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

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