订阅中的 Angular 订阅

2023-11-22

我有以下由多个订阅组成的代码。我需要实现的目标是这样的:

  1. 订阅activatedRoute以获取用户和产品数据。
  2. 返回商品数据后,使用商品数据订阅getSeller服务。
  3. 使用返回的卖家数据订阅 getRating 服务。

我的问题:有没有更好的方法来执行这些嵌套订阅?这样做是一个好的做法吗?

this.activatedRoute.data.pipe(
 map((data) => {
    this.user = data['user'];
    this.product = data['product'];

    return this.product;
  })
).subscribe(result => {

  if (this.product === null) {
    this.router.navigate(['/home']);
  } else {
    this.displayCurrency = this.dataService.getCurrencySymbolById(this.product.currency);

    this.userService.getUser(this.product.createdBy).subscribe(seller => {
      this.seller = seller;

      this.ratingService.getRatingByUserId(seller.id).subscribe(rating => {
        this.rating = rating;
      })

    });
  }
});

从技术上讲,嵌套订阅是可行的,但有一种更优雅、更系统的方法来处理这个问题。您确实应该更多地了解 RxJS 运算符。

首先,我们使用mergeMap将 activateRoute 中的可观察值映射到内部可观察值。

然后,我们使用forkJoin将可观察量组合成单个值可观察量,从而在.subscribe()

this.activatedRoute.pipe(
    tap(data => console.log(data)),
    mergeMap(data => {
      if (data.product === null) {
        this.router.navigate(['/home']);
      } else {
        const getCurrency = this.dataService.getCurrencySymbolById(data.product.currency);
        const getUsers= this.userService.getUser(data.product.createdBy);
        const getRatings = this.ratingService.getRatingByUserId(seller.id)
        return forkJoin(getCurrency, getUsers, getRatings);
      }
    })
  ).subscribe(res => {
    console.log(res[0]); // currency
    console.log(res[1]); // user
    console.log(res[2]); // ratings

  }

编辑:结果我误读了原来的问题,因为 getRatingsByUserId 依赖于 getUser。让我做一些改变。不管怎样,我都会保留上面的代码,因为它有利于OP的参考。

this.activatedRoute.data.pipe(
  switchMap(data => {
    this.user = data['user'];
    this.product = data['product'];
    return this.userService.getUser(this.product.createdBy);
  }),
  switchMap(data => {
    if (this.product === null) {
      this.router.navigate(['/home']);
    } else {
      this.seller = seller;
      return this.userService.getRatingByUserId(this.product.createdBy); 
    }
  })
).subscribe(res => {
 console.log(res)
 // handle the rest
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

订阅中的 Angular 订阅 的相关文章

随机推荐

  • TObject 包含哪些数据?

    TObject InstanceSize 返回 8 但 TObject 未声明任何数据成员 根据TObject ClassType的实现 前4个字节可以解释为指向对象的TClass元数据的指针 有人知道另外 4 个字节的开销是做什么用的吗
  • WSFederationAuthenticationModule.IsSignInResponse 中存在潜在危险的 Request.Form

    在我的 MVC3 站点中 我避免使用新的 ValidateInput 属性设置 requestValidationMode 2 0 但现在我尝试切换到 WIF 进行身份验证 当 STS 重定向回我的站点时 我收到异常 因为WSFederat
  • 如何检查函数的模板参数是否具有某种类型?

    假设我有一个具有模板类型的函数T和另外两个班级A and B template
  • 如何运行 GCC 预处理器来获取 #define 等宏扩展后的代码?

    GCC 预处理器是否可以生成 C 源代码并过滤掉不相关的源代码 例如 一个 c文件有一个 define切换以定义许多不同的平台 我只对一个平台感兴趣 并且我希望 C 预处理器过滤掉不相关的代码 Does GCC支持这个吗 是的 使用 E o
  • 从 C# 将二进制数据插入 SQL,无需存储过程

    有谁知道是否可以在不使用存储过程的情况下从 C 将二进制数据插入 SQL 字段 例如 将字节数组转换为 base64 或类似的东西 然后使用如下所示的文本命令 String Format update A set B 0 where C D
  • 在 ASP.NET 中使用依赖注入和工厂模式传递服务

    我正在使用 ASP NET Core 我知道框架已经提供了这样的日志记录机制 但用这个来说明我的问题 我正在使用工厂模式来构建 Logger 类 因为我不知道日志记录的类型 因为它存储在数据库中 ILogger 合约 Log string
  • 以编程方式将 Excel 2003 文件转换为 2007+

    我正在寻找一种方法 基本上获取 2003 年旧文件扩展名 xls 的 excel 文件文件夹 并将它们转换为 xlsm 我知道你可以自己进入Excel表并手动完成 但是有没有办法用代码来完成呢 具体使用任何类型的库 这不是我的代码 但我以前
  • SQL 按日期范围内的频率进行分组

    我需要编写一个存储过程 它接受开始日期 结束日期和频率 日 周 月 季度 年 并根据这些参数输出结果集 显然 简单的部分是按日期范围查询 但是如何按频率分组呢 因此 如果有一组像这样的原始数据 Date Count 11 15 2011 6
  • SonarQube 6.1:如何在没有仪表板的情况下查看随时间的变化?

    SonarQube 曾经有仪表板 可以非常方便地显示指标如何随时间变化 甚至还有一个名为 时间机器 的仪表板 如何在 SonarQube 6 1 中查看此类信息 我很欣赏对 泄漏期 的新关注 但这并不是我关心的全部 转到项目的 度量 空间并
  • LibUsbDotNet 调用 UsbDevice.AllDevices 时未找到设备

    我正在执行 LibUsbDotNet 的示例代码 它将返回所有连接的 USB 设备的信息 您可以在下面找到此代码 using System using LibUsbDotNet using LibUsbDotNet Info using L
  • 尝试在 Windows 上重定向 stdout 和 stderr - _fileno(stdout) 返回 -2

    这是我的第一个问题 我即将将一些运行良好的 C 代码从 UNIX 移植到 Windows 它通过管道将 stdout 和 stderr 重定向到自定义 GUI 组件 我需要它来显示来自第三方库的反馈 该第三方库仅将消息输出到 GUI 上的标
  • 在C python中,访问字节码评估堆栈

    给定一个 C Python 帧指针 如何查看任意计算堆栈条目 一些特定的堆栈条目可以通过locals 我说的是其他堆栈条目 我不久前问了一个更广泛的问题 获取 C python exec 参数字符串或访问计算堆栈 但在这里我想重点关注能够在
  • 使用多语句 lambda 进行返回类型推导

    我一直在编写代码 最近发现 g 不会警告我某一类问题 根据 C 11 5 1 2 4 如果您的 lambda 不是单个返回语句 则返回类型必须声明为尾随返回类型或为 void 尽管 g 允许编译无效代码 如果它足够有意义 但有没有办法关闭此
  • 使用 SSIS 加载多个表并保持外键关系

    我正在尝试使用 SSIS 将单个文件 包含数百万条记录 中的数据加载到 SQL Server 上的多个表中 同时维护文件中定义的关系 为了更好地举例说明 假设我正在尝试加载一个文件 其中包含员工姓名 他们过去占用的办公室以及由选项卡分隔的职
  • Python Numpy 中的数组和 __rmul__ 运算符

    在一个项目中 我创建了一个类 我需要这个新类和一个真实矩阵之间的操作 所以我重载了 rmul 像这样的功能 class foo object aarg 0 def init self self aarg 1 def rmul self A
  • 如何在图像上绘制带有轮廓的文本?

    我一直在搜索和寻找在图像上绘制带有轮廓的文本 这是我的代码 private static void tulisnamafile string imagepath string textnya Image image Image FromSt
  • WinRT StorageFile 写入下载的文件

    我正在努力解决一个简单的问题 我想使用以下代码从网络下载图像 WebRequest requestPic WebRequest Create http something com id jpg WebResponse responsePic
  • preg_match:仅数字字母和逗号

    如何编写仅匹配数字字母和逗号的正则表达式 我想出了下面这个 但它不起作用 它也接受其他标点符号 check for matches number alphabets and commas only if preg match a zA Z0
  • 由于环境变量(HP笔记本电脑),delphi XE2无法在我的计算机上编译任何项目

    我有一台 HP 笔记本电脑 并且在 HP 笔记本电脑上安装了 delphi xe2 过去 5 个月前我使用 delphi 没有任何问题 但现在我收到此错误消息 DCC Error E1026 File not found FMX Filte
  • 订阅中的 Angular 订阅

    我有以下由多个订阅组成的代码 我需要实现的目标是这样的 订阅activatedRoute以获取用户和产品数据 返回商品数据后 使用商品数据订阅getSeller服务 使用返回的卖家数据订阅 getRating 服务 我的问题 有没有更好的方