使用RXJS last()

时间:2018-06-05 08:19:08

标签: rxjs

我无法使用RXJS方法获得我需要的东西。

this.tutorials$
  .pipe(
    map( data => data.map(item => item.id)), // returns [10,20,30,40]
    last()
  )
  .subscribe( console.log ); // returns nothing. Isn't supposed to return 40?

我想提取数组的最后一项。我究竟做错了什么?除了最后一种方法之外还有更好的方法吗?

感谢。

3 个答案:

答案 0 :(得分:1)

您的Observable应该发出数组本身,而不是数组的元素。因此,您将无法获得最后一项,而是获得整个数组。

按如下所示修改代码以获取数组中的最后一项:

this.tutorials$
  .pipe(
   map( data => data.map(item => item.id)), // emit array
   concatMap(array=>from(array)), // emit array elements
   last() // get the last element
  )
  .subscribe( console.log ); 

答案 1 :(得分:1)

last 运算符只会在observable完成时发出一个项目。我不知道你的教程$ observable做了什么,但我猜这就是为什么没有返回的原因。

https://www.learnrxjs.io/operators/filtering/last.html

此外,rxjs运算符对发出的项目序列进行操作,而不是对发出的项目本身进行操作。如果您只想提取该数组的最后一个值,请在 map()运算符中进行。

this.tutorials$
  .pipe(
    // will error on empty array, be more defensive here
    map( data => data[data.length-1].id)
    )
  .subscribe( console.log ); // return 40, every time the tutorials$ emits

但是我理解你的困惑,当我开始使用rxjs时我犯了同样的错误......

答案 2 :(得分:1)

您需要注意两件事:

  1. 什么是this.tutorials$并完成了?如果它只是一个Ajax请求,那么你很好,因为它立即完成,但如果它是另一方面的主题而你永远不会调用this.tutorials$.complete()那么这个链将永远不会完成,因此last()将不会发出任何东西,因为它不知道何时到达最后一个值。

  2. 正如您所提到的,map(...)返回一个数组[10,20,30,40],但last()会从其源Observable发出最后一个发射。不是数组中的最后一项。因此,您实际上可能只想使用map(ids => ids[ids.length -1])