首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rxjs switchMap + toArray

Rxjs switchMap + toArray
EN

Stack Overflow用户
提问于 2020-07-03 13:23:58
回答 2查看 548关注 0票数 0

我对rxjs有个问题。

我有一个应该这样做的功能:

具有组ids列表的

  • 。在这个示例中:of(['1', '2'])
  • For每个人都获取聊天列表
  • 返回聊天

的合并列表

当执行到达toArray时,什么都不会发生,没有结果。

代码

代码语言:javascript
复制
  get chats$(): Observable<Chat[]> {
    return of(['1', '2']).pipe(
      filter(groupIds => !!groupIds && groupIds.length > 0),
      switchMap(groupIds => groupIds),
      switchMap(groupId => getGroupChats(groupId)), // fetch list of chats for the group id
      toArray(),
      map(doubleList => {
        return ([] as Chat[]).concat(...doubleList); // merge chat lists
      })
    );
  }

我也试过这个:

代码语言:javascript
复制
get chats$(): Observable<Chat[]> {
    return of(['1', '2']).pipe(
      filter(groupIds => !!groupIds && groupIds.length > 0),
      map(groupIds =>
        groupIds.map(groupId => getGroupChats(groupId))
      ),
      switchMap(chatList$ =>
        forkJoin(chatList$).pipe(
          map(doubleList => {
            return ([] as Chat[]).concat(...doubleList);
          })
        )
      )
    );
}

测试

测试响应是:Error: Timeout - Async callback was not invoked within 5000ms

代码语言:javascript
复制
describe("WHEN: get chats$", () => {
  const CHAT_MOCK_1: Chat = {
    id: "1",
  };
  const CHAT_MOCK_2: Chat = {
    id: "2",
  };

  it("THEN: get chats$ should return chat list", (done) => {
    service.chats$
      .subscribe((data) => {
        expect(data.length).toEqual(2);
        expect(data[0]).toEqual(CHAT_MOCK_1);
        expect(data[1]).toEqual(CHAT_MOCK_2);
        done();
      })
      .unsubscribe();
  });
});
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-10 15:22:53

最后,这就是我所做的(而且起作用了):

  • 使用普通Array.map将组ids数组转换为可观察对象列表,每个可观测值包含该组的聊天数组。
  • 使用forkJoin获取生成的数组的每个可观测值的最终发出值。

代码

代码语言:javascript
复制
get chats$(): Observable<Chat[]> {
    return this.groupsIds$.pipe(
        skipUntil(this._groupsLoaded$),
        switchMap((ids) => {
            const chatsList: Observable<Chat[]>[] = ids.map((id) =>
                this.getGroupChats$(id)
            );

            return forkJoin([...chatsList]).pipe(
                map((list) => ([] as Chat[]).concat(...list))
            );
        })
    )
}

我仍然有一些疑问,为什么这是可行的,而不是以前的版本,如果有人可以解释,如果这将是伟大的。

作为结论:不要连接多个switchMap

票数 0
EN

Stack Overflow用户

发布于 2020-07-03 13:38:04

此代码段将接受一个ids数组,分别获取结果并将其收集到数组中。

代码语言:javascript
复制
from([1,2,3,4])
  .pipe(
    mergeMap(a => of(a * 10)), // send request if you need hare or any observable
    toArray()
  ).subscribe(console.log);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62716379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档