簡體   English   中英

使用RXJS映射返回數組/對象而不是可觀察對象

[英]Return an array/object instead of an observable using RXJS map

我有以下代碼,它返回一個帶有每個項鍵的項詳細信息的observable:

this.list = this.af.database.list("API_URL")
      .map((ItemKeys) => {
        return ItemKeys.map((ItemKey) => {
          return this.af.database.object(API_URL + "/" + ItemKey); //I need this as the object (not observable)
        });
      }).subscribe((items) => {
        this.lineData = items; //A list of observables
      });

代碼迭代每個項密鑰並從另一個端點獲取項數據。 問題是它重新編譯每個項目數據的可觀察量,我需要它在一個對象(可觀察的結果)中。

我嘗試使用以下代碼返回訂閱結果,但隨后我的所有項目數據都為空(未定義):

this.list = this.af.database.list("API_URL")
      .map((ItemKeys) => {
        return orderItemKeys.map((ItemKey) => {
          this.af.database.object("API_URL" + "/ItemKey.$key) // So I tried to subscribe to this..
          .subscribe((data) => {
            return data;
          });
        });
      }).subscribe((items) => {
        this.lineData = items; // A list with undefined items
      });

如何將項數據對象作為對象返回,而不是在我的情況下作為對象的可觀察對象?

不要在運營商內返回訂閱(來自訂閱)。 那可能不是你想打算做的。

對於檢索對象列表的內部部分,您應該能夠將從Array#map()創建的可觀察Array#map()轉換為具有Observable#from()的高階observable。 您需要mergeAll()將這一系列的observable恢復為單個流,然后使用toArray()將所有發出的項收集到一個數組中。 然后使用mergeMap()提取最后一個observable。

this.list = this.af.database.list("API_URL")
  .mergeMap((ItemKeys) => {
    return Observable.from(ItemKeys.map((ItemKey) => {
      return this.af.database.object(API_URL + "/" + ItemKey);
    })).mergeAll().toArray();
  })
  .subscribe((items) => {
    this.lineData = items;
  });

你應該用flatMap替換map ,因為它能夠展平Observable<Observable<T>>

var responseStream = requestStream
    .flatMap(function(requestUrl) {
        return Rx.Observable.fromPromise(jQuery.getJSON(requestUrl));
});

responseStream.subscribe(() => {});

嘗試調整和簡化您的代碼

const databaseList = () => Rx.Observable.from(['a6b54x4', '1e23sa4q']);
const databaseObject = (id) => Rx.Observable.of({ id, status: 'ok' })

databaseList() 
   .flatMap(x => databaseObject(`id/${x}`))
   .reduce((x, y) => x.concat(y), [])
   .subscribe(console.log);

基本上,它仍然使Observable<Observable<T>>變平,然后使用reduction,將所有內容合並到一個結果數組中。

https://jsfiddle.net/6pLpo3cp/

RXJS 更好的方法來 map 和過濾器數組內部的 Observable<object><div id="text_translate"><p> 這是我想要完成的一個非常簡單的版本。 目前它正在按預期工作,但我只是想知道是否有更短/更清潔的方法來實現 pipe() 內部的運算符</p><p><strong>當前行為:</strong>在包含數組“項目”的屬性的可觀察對象上調用 pipe。 在 pipe 內部,過濾、排序然后將項目發布到行為主體。</p><pre> public items$: BehaviorSubject public testObservable = () =&gt; of({ Test: '123', Properties: 'props', Items: [ { key: 1, val: 'test1' }, { key: 2, val: 'test2' }, { key: 3, val: 'test3' } ] }); testMethod() { this.testObservable().pipe( pluck('Items'), map(items =&gt; items.filter(item =&gt; item.key,= 2)). map(items =&gt; items,sort((a. b) =&gt; (a.key &gt; b?key: 1, -1))). tap(items =&gt; { this.items$;next(items) }) );</pre></div></object>

[英]RXJS better way to map and filter array inside of Observable<object>

暫無
暫無

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

相關問題 用 rxjs 修改 observable 中的數組,返回整個 object Angular 2和RxJS:使用Rx Observable映射數組 需要RxJS澄清:如何返回普通對象而不是Observable RXJS映射和過濾器數組-返回單個對象而不是一個對象的數組? Angular &amp; Rxjs:如何在返回 Observable 的函數中將 json 映射到對象數組 RXJS 更好的方法來 map 和過濾器數組內部的 Observable<object><div id="text_translate"><p> 這是我想要完成的一個非常簡單的版本。 目前它正在按預期工作,但我只是想知道是否有更短/更清潔的方法來實現 pipe() 內部的運算符</p><p><strong>當前行為:</strong>在包含數組“項目”的屬性的可觀察對象上調用 pipe。 在 pipe 內部,過濾、排序然后將項目發布到行為主體。</p><pre> public items$: BehaviorSubject public testObservable = () =&gt; of({ Test: '123', Properties: 'props', Items: [ { key: 1, val: 'test1' }, { key: 2, val: 'test2' }, { key: 3, val: 'test3' } ] }); testMethod() { this.testObservable().pipe( pluck('Items'), map(items =&gt; items.filter(item =&gt; item.key,= 2)). map(items =&gt; items,sort((a. b) =&gt; (a.key &gt; b?key: 1, -1))). tap(items =&gt; { this.items$;next(items) }) );</pre></div></object> RxJS / Observable flatMap可以返回Observable或數組 Rxjs:map 數組字段中的每個元素來自 object 的可觀察對象和另一個可觀察對象 RxJS 6 過濾並映射可觀察的項目數組 RxJs如何在Observable中映射項目<Array>
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM