使用RXJS映射返回数组/对象而不是可观察对象

时间:2016-12-01 18:00:01

标签: angular rxjs angularfire2

我有以下代码,它返回一个带有每个项目键的项目详细信息的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
      });

如何将项数据对象作为对象返回,而不是在我的情况下将对象作为对象的可观察对象?

2 个答案:

答案 0 :(得分:1)

不要在运营商内返回订阅(来自订阅)。这可能不是你想要的。

对于检索对象列表的内部部分,您应该能够将从Array#map()创建的可观察数组转换为具有Observable#from()的高阶可观察对象。您需要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;
  });

答案 1 :(得分:0)

您应该将map替换为flatMap,因为它可以展平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>>变平,然后使用缩减,将所有内容合并到结果数组中。

https://jsfiddle.net/6pLpo3cp/