我无法使用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?
我想提取数组的最后一项。我究竟做错了什么?除了最后一种方法之外还有更好的方法吗?
感谢。
答案 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)
您需要注意两件事:
什么是this.tutorials$
并完成了?如果它只是一个Ajax请求,那么你很好,因为它立即完成,但如果它是另一方面的主题而你永远不会调用this.tutorials$.complete()
那么这个链将永远不会完成,因此last()
将不会发出任何东西,因为它不知道何时到达最后一个值。
正如您所提到的,map(...)
返回一个数组[10,20,30,40]
,但last()
会从其源Observable发出最后一个发射。不是数组中的最后一项。因此,您实际上可能只想使用map(ids => ids[ids.length -1])
。