angular - 在可观察对象上使用 first() 运算符来获取第一个元素

标签 angular operators rxjs observable

我是 RxJS 的新手,在这个 plunk 我正在尝试返回数组中的第一个成员,我尝试了 first() 运算符但它没有返回任何内容:

var one = this.http.get(this.memberUrl)
  .map( this.extractData )
  .map(processArray => {
  return processArray.filter(x=> x.type === "member")
  //.first()
  })

app/member.service.ts 中的注释行有什么问题?

最佳答案

当您使用 .map() 时, 它的参数是 Observable 的类型.

因为您的服务中有一个 Observable<Member[]> , 然后 processArray

.map(processArray => {
   return processArray.filter(x=> x.type === "member")
   //.first()
})

是一个数组 - Member[] .

因此.filter()您调用的电话是Array#filter()不是 Observable#filter() .

.first() 相同你会调用 Array#first()不是 Observable#first() .

Array没有 .first()数组,它会产生运行时错误 ( see plunker )。


更进一步,如果您改为调用 .first()Observable ,你不会看到太大的区别,因为它是一个 Observable<Member[]> , 它会得到那个 Observable 的第一个元素这是整个数组。


解决方案:

如果你真的想让它一直是 Observable<Member[]>并仅检索第一个成员,您可以这样做 ( see plunker ):

.map(processArray => {
  console.log('pa2', typeof processArray);
  return [ processArray.filter(x=> x.type === "member")[0] ] // <-- [0] to get first item
                                    // wrap the result in [ ]s, because it expects an array
})

尽管我建议您要做的是将可观察对象变成 Observable<Member> (而不是 Observable<Member[]> )。您可以使用 .mergeMap()/.flatMap() 来做到这一点.

app/member.service.ts

import 'rxjs/add/operator/mergeMap'; // <------------------ add this import

getMembers (): Observable<Member> { // <----------- changed from Member[] to Member
  var one = this.http.get(this.memberUrl)
    .map( this.extractData )
    .mergeMap(processArray => {  // <----------------- map to mergeMap
      return processArray.filter(x=> x.type === "member")
    }).first()                   // <----------------------- now you can use .first()

app/member-list.component.ts

import 'rxjs/add/operator/toArray'; // <------------------ add this import
...
getMembers() {
  this.memberService.getMembers().toArray() // <-------------- add .toArray()
                 .subscribe(

参见 final demo plunker here .

关于angular - 在可观察对象上使用 first() 运算符来获取第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38709691/

相关文章:

Angular 5 构建错误 "Property does not exist on type"

css - 在单个 NgStyle 标签中混合多个条件?

java - C 和 Java 中表达式++a,a,a-- 的输出

javascript - RxJS乐观更新(强制发出乐观值)

angular - NGRX - 每次效果后运行函数

Angular2 图像未显示

python - 我如何在python中进行幂运算?

c# - 我应该重载 == 运算符吗?

http - RxJS Angular2 在 Observable.forkjoin 中处理 404

angular - 带有 ngFor 元素的 ngModel 的动态 angular2 形式