【问题标题】:Map Observable of Array using Observable使用 Observable 映射数组的 Observable
【发布时间】:2018-08-27 01:51:07
【问题描述】:

我试图找到一种方法来让这个场景发挥作用:

  • 我有一个可观察的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 个 observable,每个都发出我的 TalkWithPerson 对象。 (Observable<Observable<TalkWithPerson>>)

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

我正在考虑让所有人和所有谈话都走得很艰难,并使用带有项目功能的combineLatest 来匹配记录,但我不想加载所有人,它会导致加载巨大的清单...

感谢您的帮助!

堆栈闪电战:https://stackblitz.com/edit/talks-person

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    试试这个:

    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' 管道运算符相同

    【讨论】:

    • toArray 导致 observable 不发射,肯定是因为源没有完成
    • 这里的 toArray 位于从 'talks' 创建的内部 observable 上。通过名称“getPersonById”,我假设它是一个在一个值之后完成的可观察对象。 Lmk 如果没有,我将编辑我的答案。
    • 我将方法 getPersonById 更改为在一个值之后完成并且它正在工作,谢谢!
    • 但是如果 getPersonById 不会返回一次,你能给我一个方法吗?仅供学习:)
    • 如果它没有立即完成,您应该决定何时收集所有发出的项目并将它们转换为数组。这确实取决于您的情况,但这里有一些选项: 仅从“getPersonById”中获取第一项 - 您可以在“map”之前的管道中使用 take(1)。缓冲项目并在一段时间后发出它们 - 检查缓冲操作符
    【解决方案2】:

    为此使用flatMap 运算符。 flatMapObservable<Observable<TalkWithPerson[]>> 解包成 Observable<TalkWithPerson[]>

    所以尝试这样做:

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

    【讨论】:

    • exhaustMap(talks => : 这里的 talk 不是可观察的,所以没有 flatMap 并且 rxjs 的点符号 btw 已经死了
    • 如果可能,你能创建一个 stackbliz 吗?
    猜你喜欢
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 2018-10-17
    • 2018-09-22
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多