使用Observable

时间:2018-08-26 17:17:31

标签: angular rxjs

我试图找到一种使这种情况起作用的方法:

  • 我有一个可观察的talks$,其中列出了所有对话。
  • 谈话具有属性personId
  • 此属性可以使用Observable映射到此人。
  • 我尝试将其映射到类TalkWithPerson

const test = this.talks$.pipe(
  exhaustMap(talks =>
    talks.map(t => this.getPersonById(t.personId).pipe(map(p => newTalkWithPerson(t, p))))
  ),
);

当前,它发出2个可观察到的信号,每个发出我的TalkWithPerson对象。 (Observable<Observable<TalkWithPerson>>

如果可能的话,我希望有一个Observable<TalkWithPerson[]>

我当时想让所有人和所有话题都走上艰难的道路,并使用带有项目功能的combineLatest来匹配记录,但是我不想载入所有人,这会导致加载大量列表...

谢谢您的帮助!

StackBlitz:https://stackblitz.com/edit/talks-person

2 个答案:

答案 0 :(得分:2)

尝试一下:

const test = this.talks$.pipe(
    exhaustMap(talks =>
        from(talks)
            .pipe(
                mergeMap(t => this.getPersonById(t.personId).pipe(map(p => newTalkWithPerson(t, p)))),                  
                toArray())
            )
  ),
);
  • from导入为创建方法import { from } from "rxjs";
  • 导入toArray与'map'可管道运算符

答案 1 :(得分:0)

为此使用flatMap运算符。 flatMap会将Observable<Observable<TalkWithPerson[]>>解包到Observable<TalkWithPerson[]>

所以尝试这样做:

const test = this.talks$.pipe(
  exhaustMap(talks =>
    talks.flatMap(t => this.getPersonById(t.personId).pipe(map(p => newTalkWithPerson(t, p))))
  ),
);