有没有一种方法可以对另一个可观察数组的每个元素使用可观察返回函数? [英] Is there a way to use a observable returning function for each element of another observable array?

查看:26
本文介绍了有没有一种方法可以对另一个可观察数组的每个元素使用可观察返回函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从Firebase集合中获得了一个 Observable< Group []> .在这个Group类中,是一个ID,我想用它从Firebase中检索另一个数据集数组,它是每个 Observable< Message []> 唯一组的消息.(每个组都有自己的聊天室:消息[] )并且它想返回一个包含新Type数组的observable:将{... group,消息:Message []}作为GroupWithMessages返回

I get an Observable<Group[]> from my Firebase collection. In this Group class is an id which I wanna use to retrieve another dataset array from Firebase, which would be messages for each unique group Observable<Message[]>.(each group has its own chat: Message[]) And it want to return an observable which hold an array of a new Type: return { ...group, messages: Message[] } as GroupWithMessages

最终目标应该是 Observable< GroupWithMessages []>

getGroupWithChat(): Observable<GroupWithMessages[]> {
    const groupColl = this.getGroups(); // Observable<Group[]>

    const messages = groupColl.pipe(
      map(groups => {
        return groups.map(meet => {
          const messages = this.getMessagesFor(group.uid);
          return { messages:messages, ...group} as GroupWithMessages
        });
      })
    );

    return messages;

  }
}

这里是消息功能

 getMessagesFor(id: string): Observable<Message[]> {
    return this.afs.collection<Message>(`meets/${id} /messages`).valueChanges();
}

这是行不通的,因为当我创建新的Obj时,我无法绑定 messages:messages ,因为消息与vom typ Observable< Message []>

sadly that doesnt work because when i create the new Obj I cannot bind messages:messages because messages ist vom typ Observable<Message[]>

我希望能清除一切

更新:我的主要问题现在归结为:

UPDATE: my main problem now comes down to this:

getGroupsWithMessages() {
    this.getJoinedGroups()
      .pipe(
        mergeMap(groups =>
          from(groups).pipe(
            mergeMap(group => {
              return this.getMessagesFor(group.uid).pipe(
                map(messages => {
                  return { ...group, messages } as GroupIdMess;
                })
              );
            }),
            tap(x => console.log('reaching here: ', x)),
            toArray(),
            tap(x => console.log('not reaching here = completed: ', x))
          )
        ),
        tap(x => console.log('not reaching here: ', x))
      )
      .subscribe(x => console.log('not reaching here: ', x));
  }

当我调用该函数时,console.log如下:

when i call that function my console.log is as follows:

推荐答案

我通常通过将 Observable< any []> 拆分为 Observable< any> 来实现,然后 mergeMap 将结果显示到内部Observable.

I usually do that by splitting Observable<any[]> to Observable<any> and then mergeMap the results to inner Observable.

类似的事情应该起作用:

Something like this should work:

  getMessagesFor(id: string): Observable<number> {
    return of(1);
  }

  getGroups(): Observable<string[]> {
    return of(["1", "2"]);
  }

  getGroupWithChat() {
    this.getGroups().pipe(
      mergeMap(groups => from(groups)), // Split the stream into individual group elements instead of an array
      mergeMap(group => {
        return this.getMessagesFor(group).pipe(
          map(messages => {
            return Object.assign(group, messages);
          })
        );
      })
    );
  }

请考虑BehaviorSubject.它根本没有完成:

Consider BehaviorSubject. It doesn't complete at all:

const behSub: BehaviorSubject<number[]> = new BehaviorSubject([1, 2, 3]);

setTimeout(() => {
  behSub.next([4, 5, 6]);
}, 5000);

behSub
  .pipe(
    mergeMap(arr =>
      from(arr).pipe(
        tap(), // Do something with individual items, like mergeMap to messages
        toArray() // Go back to array
      )
    )
  )
  .subscribe(console.log, null, () => {
    console.log('Complete');
  });

这篇关于有没有一种方法可以对另一个可观察数组的每个元素使用可观察返回函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆