【问题标题】:RXJS observable in observableRXJS 在 observable 中可观察
【发布时间】:2021-08-29 14:57:56
【问题描述】:

我编写了这段代码:

return this.projectService.oneById(id).pipe(mergeMap(project => {
      if (!project) {
        return [];
      }

      const stories = this.getStories(id);

      return combineLatest(project.members.map(member => {
        return this.userService.one(member.id).pipe(map(memberData => {
          const assigned = stories.pipe(mergeMap(t => combineLatest(t.filter(task => {
            if (task && task.assignee?.id === member.id) {
              return {
                ...task,
                id: task.id
              };
            }
          }))));

          return {
            id: member.id,
            name: memberData?.displayName ?? 'Unknown',
            assigned
          };
        }));
      }));
    }));

但是我遇到了一个问题,因为我的函数期望返回 Observable<Type[]>,但它目前正在返回 Observable<{ ...etc, object: Observable<Type[]> }

显然问题在于可观察对象内部的可观察对象。但是,我不确定在这种情况下如何解决这个问题。我已经在我当前的代码中多次解决了这个问题,但是我很难理解这个问题,因为无论我尝试什么都没有改变。

感谢您提前提供帮助。

PS:确切的警告是这样的:

Type 'Observable<{ id: string; name: string; assigned: Observable<[UserStory | undefined]>; }[]>' is not assignable to type 'Observable<Member[]>'.   Type '{ id: string; name: string; assigned: Observable<[UserStory | undefined]>; }[]' is not assignable to type 'Member[]'.     Type '{ id: string; name: string; assigned: Observable<[UserStory | undefined]>; }' is not assignable to type 'Member'.       Types of property 'assigned' are incompatible.         Type 'Observable<[UserStory | undefined]>' is missing the following properties from type 'UserStory[]': length, pop, push, concat, and 25 more.

【问题讨论】:

  • 你能提供你的Member接口代码吗?根据错误,您的方法返回 Member[] 以外的其他类型的数据。
  • 您的会员类型是什么形状?您将返回形状为 { id, name, assigned } 的对象作为第二个 map() 的输出,然后将 { id, name, assigned }[] 作为第一个映射的输出。如果您的 Member 类型不是那个形状并且 this.projectService.oneById 返回 Member[] 那么就会有问题。

标签: angular typescript rxjs rxjs-observables


【解决方案1】:

threre 是一个你试图将 observable 而不是数组作为对象的地方。这段代码应该会更好

return this.projectService.oneById(id).pipe(mergeMap(project => {
  if (!project) {
    return [];
  }
  const stories = this.getStories(id);

  return combineLatest(project.members.map(member => {
    return this.userService.one(member.id).pipe(map(memberData => {
      const assigned$ = stories.pipe(mergeMap(t => combineLatest(t.filter(task => {
        if (task && task.assignee?.id === member.id) {
          return {
            ...task,
            id: task.id
          };
        }
      }))));
      return assigned$.pipe(map(assigned => ({
       id: member.id,
       name: memberData?.displayName ?? 'Unknown',
       assigned
      })));
    }));
  }));
}));

【讨论】:

    猜你喜欢
    • 2020-06-29
    • 2021-01-11
    • 1970-01-01
    • 2019-10-18
    • 2016-05-17
    • 2017-06-11
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多