微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在switchMap中进行嵌套的Http调用

如何解决在switchMap中进行嵌套的Http调用

if (this.role === 'admin' || this.role === 'superadmin') {
  this.organizationService.getDropdownorganizations().pipe(
    tap(availableOrganizations => {
      this.availableOrganizations = availableOrganizations;
    }),switchMap(availableOrganizations => {
      return this.projectService.getProjects(availableOrganizations[0]?.id);
    }),).subscribe(availableProjects => {
    this.availableProjects = availableProjects;
    this.getNotifications();
  });
} else {
  this.getNotifications();
}

大家好,

在上面的代码中,我将orgId传递给项目服务并订阅availableProjects

我的问题是我想向getUsers()发出另一个与getProjects()相同的请求,并传递orgId并以此来获取项目和用户

怎么办?

解决方法

很多我们都不知道。我假设getProjectsgetUsers都发出一次然后完成。在这种情况下,您可以使用forkJoin一次处理这两项,并在完成后返回两者的结果。

可能看起来像这样:

if (this.role === 'admin' || this.role === 'superadmin') {
  this.organizationService.getDropdownOrganizations().pipe(
    tap(availableOrganizations => 
      this.availableOrganizations = availableOrganizations
    ),switchMap(availableOrganizations => forkJoin({
      projects: this.projectService.getProjects(availableOrganizations[0]?.id),users: this.projectService.getUsers(availableOrganizations[0]?.id)
    })),).subscribe(({projects,users}) => {
    this.availableProjects = projects;
    this.availableUsers = users;
    this.getNotifications();
  });
} else {
  this.getNotifications();
}
,

如果您希望它们在同一时间执行,我会使用forkJoin来做到这一点。

switchMap(availableOrganizations => {
  return forkJoin([
      this.projectService.getProjects(availableOrganizations[0]?.id),this.projectService.getUsers(availableOrganizations[0]?.id);
  ]);
}),

然后,您可以访问两个值,作为传递给下一个流运算符的数组的属性。我建议在那里使用数组销毁:

).subscribe(([availableProjects,users ]) => {
,

您可以订阅相同的冷观测值,并与shareReplay

共享结果
if (this.role === 'admin' || this.role === 'superadmin') {
  const availableOrganizations$ = this.organizationService.getDropdownOrganizations().pipe(
    shareReplay(1),);

  availableOrganizations$.subscribe(availableOrganizations => this.availableOrganizations = availableOrganizations);

  availableOrganizations$.pipe(
    switchMap(availableOrganizations => this.projectService.getProjects(availableOrganizations[0]?.id)),).subscribe(availableProjects => {
    this.availableProjects = availableProjects;
    this.getNotifications();
  });

  // TODO: same for user as the previous block
} else {
  this.getNotifications();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。