【问题标题】:Why does first() rxjs operator keep returning array为什么 first() rxjs 运算符不断返回数组
【发布时间】:2018-01-19 00:15:20
【问题描述】:

我有一个具有类型功能的服务

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's 数组。

我怎样才能只取回INTsummary[] 数组中的第一个对象?

【问题讨论】:

  • Observable.first 为您提供 stream 值的第一个值,而不是作为这些值之一的 array 的第一个值。您需要在 Observable.map 中执行此操作,其中您有该数组 -> this.myService.getSummary(...).map(arr => arr[0])...

标签: javascript arrays angular ionic2 rxjs


【解决方案1】:

是的,但是返回的对象是一个数组,这个类型说明了什么:

Observable<INTsummary[]>

如果它返回普通对象,你会:

Observable<INTsummary>

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

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

【讨论】:

    【解决方案2】:

    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()
    

    【讨论】:

    • 第一个作品,但是当使用 .first() 你提到我得到类型错误first does not exist on type INTsummary[]
    • 你只是没有正确使用它,.first()Observable 的一个方法,.concatAll() 返回一个 Observable,所以问题出在你的代码中。
    • 我有一个问题,concatall 比 mergeall 更好吗?
    • @Maximus 在这种情况下,它会做同样的事情。但是我不确定性能。
    • 好的,很酷,只是想了解为什么你得到了投票而我没有,我想也许你得到了更好的东西:)。我现在意识到作者可能想要数组中的第一项,这就是我们的解决方案的不同之处
    猜你喜欢
    • 2020-07-10
    • 2012-08-23
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多