为什么first()rxjs运算符会继续返回数组

时间:2017-08-10 16:23:07

标签: javascript arrays angular ionic2 rxjs

我有一个类型为

的函数的服务

getSummary(id: string, universe: string): Observable<INTsummary[]>

当我打电话给我时,我只想要INTsummary[]中的第一项,所以我试图使用rxjs first运算符来执行此操作:

  loadQuickSummary(){
    var obj = this.myService.getSummary(this.user.id, this.user.universe).first();
    console.log("getting quick summary");
    obj.subscribe(r => {
      console.log(`first value ${JSON.stringify(r)}`)
    })
  }

从阅读文档和stackoverflow,这应该返回一个对象,但我得到一个INTsummary的数组。

如何才能找回INTsummary[]数组中的第一个对象?

2 个答案:

答案 0 :(得分:5)

first()返回Observable的第一次发射。因此,当您拥有发出类似INTsummary[]的数组的源时,它会发出它发出的第一个数组(而不是数组中的第一个数组)。

根据您的说明,您希望获得数组中的第一项,以便有两种方式:

this.myService.getSummary(this.user.id, this.user.universe)
  .map(array => array[0])

...或者如果您真的想使用first()运算符:

this.myService.getSummary(this.user.id, this.user.universe)
  .concatAll() // flatten the array into separate emission
  .first()

答案 1 :(得分:1)

是的,但是返回的对象是一个数组,这个类型表示的是:

Observable<INTsummary[]>

如果返回普通对象,您将拥有:

Observable<INTsummary>

您可以使用mergeMap运算符展平数组:

var obj = this.myService.getSummary(this.user.id, this.user.universe).first().mergeMap(r => r);