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

Angular 使用RXJS映射返回一个数组/对象,而不是一个可观察对象,angular,rxjs,angularfire2,Angular,Rxjs,Angularfire2,我有以下代码,该代码返回一个可观察值,其中包含每个项目键的项目详细信息: 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 obje

我有以下代码,该代码返回一个可观察值,其中包含每个项目键的项目详细信息:

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
      });
代码在每个项键上创建,并从另一个端点获取项数据。问题是它运行每个项目数据的可观察数据,我需要它在一个对象中(可观察结果)

我尝试使用以下代码返回订阅结果,但我的所有项目数据均为空(未定义):


如何将项目数据对象作为对象返回,而不是作为对象的可观察对象返回?

您应该将
映射
替换为
平面映射
,因为它能够展平
可观察

尝试调整和简化代码以适应此情况

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);
基本上,它仍然将
可观察的
展平,然后使用缩减,将所有内容合并到结果数组中


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

对于检索对象列表的内部部分,您应该能够将从
array#map()
创建的可观察数组转换为使用
observable#from()创建的高阶可观察数组。您需要
mergeAll()
将这一系列的可观察项带回单个流,然后使用
toArray()
将所有发出的项收集到一个数组中。然后,使用
mergeMap()
提取最后一个可观察对象


对不起,这个答案不知道我如何在我的情况下使用
flatMap
,在哪里以及如何使用。我试图将我的第一个
.map
更改为
.flatMap
,但没有成功。@TheUnreal,对不起,我的错。当时我想得不太周到。现在看看这是否有帮助。我认为
lineData
在返回可观察对象时仍将返回一个可观察对象数组:
返回this.af.database.object(API_URL+“/”+ItemKey)。我需要返回每个观察到的结果。无论如何,我刚刚测试了你的代码,并且
这个。lineData
是空的,没有到达(我在订阅中放了一个控制台日志,没有显示)删除了
toArray()
方法,它返回我的观察值而不是数组(在我的代码中,它以数组的形式重新运行它们。但我需要它们不是可观察的…。@TheUnreal更新了答案,因为toArray需要位于内部合并映射的内部,因为list()永远不会完成。
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);
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;
  });