如何在 Angular2 中进行嵌套的 Observable 调用

2023-12-23

我在进行嵌套的 Observable 调用时遇到了一些麻烦。我的意思是调用一个 http 服务来检索用户,然后从用户处获取 id 以进行另一个 http 调用,最后在屏幕上呈现结果。

1) HTTP GET 1 : 获取用户

2) HTTP GET 2:通过唯一标识符作为参数来获取用户的偏好

这将转换为组件中的以下代码Blah.ts:

版本1- 此代码不显示任何内容

 ngOnInit() {
        this.userService.getUser()
            .flatMap(u => {
                this.user = u; // save the user
                return Observable.of(u); // pass on the Observable
            })
            .flatMap(u => this.userService.getPreferences(this.user.username)) // get the preferences for this user
            .map(p => {
                this.preferences = p; // save the preferences
            });
    }

版本2- 这段代码有效,但对我来说似乎是错误的方法:

 this.userService.getUser().subscribe(u => {
            this.user = u;
            this.userService.getPreferences(this.user.username).subscribe(prefs => {
                this.preferences = prefs;
            });
        });

这是模板:

<h3>User</h3>

<div class="row col-md-12">
    <div class="col-md-6">
        <div class="panel panel-default">
            <div class="panel-heading">
                <h3 class="panel-title">User details</h3>
            </div>
            <div class="panel-body">
                <table class="table table-condensed">
                    <thead>
                        <tr>
                            <th>Username</th>
                            <th>Full Name</th>
                            <th>Enabled</th>                                
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <td>{{user?.username}}</td>
                            <td>{{user?.fullName}}</td>
                            <td>{{user?.enabled}}</td>                          
                        </tr>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
    <!-- end of col 1-->

    <div class="col-md-6">
        <div class="panel panel-default">
            <div class="panel-heading">
                <h3 class="panel-title">User preferences</h3>
            </div>
            <div class="panel-body">
                <table class="table table-condensed">
                    <thead>
                        <tr>
                            <th>Language</th>
                            <th>Locale</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                            <td>{{preferences?.preferences?.get('language')}}</td>
                            <td>{{preferences?.preferences?.get('locale')}}</td>
                        </tr>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
    <!-- end of col 2-->

</div>
<!-- end of row 1-->

我认为展示服务没有任何意义,这只会让http get()调用如下:

  http.get('http://blablah/users/')
        .map((response) => response.json())

请建议哪种方法是定义可观察量链的最佳工作方法。


您应该稍微阅读一下 rxjs 的运算符。你的例子非常冗长并且使用flatMap and map在某种程度上,它们不应该被使用。另外,您的第一个示例无法工作,因为您没有订阅 Observable。

这将满足您的需要:

ngOnInit() {
    this.userService.getUser().pipe(
        tap(u => this.user = u),
        flatMap(u => this.userService.getPreferences(u.username))
      ).subscribe(p => this.preferences = p);
}

legacy:

在 5.5 版本之前,rxjs 专门使用基于原型的运算符。 此代码在功能上等同于上面的代码:

ngOnInit() {
    this.userService.getUser()
        .do(u => this.user = u) //.do just invokes the function. does not manipulate the stream, return value is ignored.
        .flatMap(u => this.userService.getPreferences(u.username))
        .subscribe(p => this.preferences = p);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Angular2 中进行嵌套的 Observable 调用 的相关文章

  • Angular 5 - 使用对象进行表单控制

    我目前正在开发一个由 Django 支持的 Angular 应用程序 该应用程序的一部分是它需要显示成员列表 成员数组看起来有点像这样 name John Smith id 3 score set name Jane Doe id 7 sc
  • TypeScript 编译速度极慢 > 12 秒

    只是把它放在那里看看其他人是否也遇到这个问题 我已经使用 webpack 作为我的构建工具 使用 typescript 构建了一个 Angular 2 应用程序 一切都运行良好 但是我注意到 typescript 编译超级超级慢 我现在只有
  • Plesk Windows 部署 Node.js

    我创建了一个以 Node js 作为后端的 Angular 项目 这是服务器文件结构 Home directory httpdocs node hm dist browser folder server folder server js p
  • 查询参数更改时,路线不会更新

    在我的应用程序中 有多个链接 其中我有一些links与相同的route但与不同的query parameters 比如说 我有这样的链接 deposits withdrawals deposits withdrawals id 1 depo
  • 在为 RXJS 可观察量编写测试时,如何避免让调度程序通过我的业务逻辑?

    我发现使某些测试通过的唯一方法是显式地将调度程序传递给函数 为了便于说明 请考虑以下函数 function doStuff stream return stream delay 100 filter x gt x 2 0 map x gt
  • 在 angular2 中过滤数组

    我正在研究如何在 Angular2 中过滤数据数组 我研究过使用自定义管道 但我觉得这不是我想要的 因为它似乎更适合简单的表示转换 而不是过滤大量数据 数组排列如下 getLogs Array
  • Angular 4 与 Webpack 2,动态加载脚本

    我刚刚在一个项目中尝试使用 Angular 4 和 Webpack 2 我试图在 ngOnInit 期间加载一些脚本 但遇到了一些问题 问题1 我的 ngOnInit 中有以下代码 System import node modules jq
  • 模块“node_modules/@angular/core/core”没有导出成员“OpaqueToken”

    node modules ionic cloud angular dist es5 index d ts 打字稿错误 模块 home ritzylab ionic code 20 11 munshiji247 ionic node modu
  • 如何在 angular2 中触发表单验证器?

    我创建了 angular2 Web 应用程序 我已经使用表单生成器实现了一个自定义验证器 它将在提交时工作 但我需要在其他表单控件值更改中动态触发验证 请任何人提出建议来实现这一目标 谢谢 尝试这个 this RegisterForm1 c
  • Angular Grid Ag-Grid,使列可动态编辑

    好吧 标题看起来和其他帖子很相似 Angular Grid ag grid columnDefs 动态改变 https stackoverflow com questions 31743534 angular grid ag grid co
  • 角度 - 传递管道作为变量

    如何存储和使用变量中的管道信息 我已经搜索了很多 但找不到解决方案 我想要实现的是将任何有效的管道信息作为变量 小数 百分比 日期 自定义等 传递 下面是一个简单的例子 父组件 ts columnsDef value 0 35 pipeIn
  • 角度 2 中的动态 styleUrls?

    是否可以将样式表的 url 动态注入到组件中 就像是 styleUrls stylesheet1 css this additionalUrls 或者 一厢情愿并注意这只是假代码 export class MyComponent imple
  • React无限滚动scrollableTarget动态获取id?

    我在我的项目中使用react infinite scroll component 如何让scrollableTarget动态获取item id 我试过这样scrollableTarget item id 但它不起作用 必须与该 div 具有
  • 如何更改订阅值?使用 rxJS

    我正在创建一个计时器 需要你的帮助 我刚刚学习 Angular 和 rxJS 对此我有一些疑问 我正在创建一个具有启动 停止 暂停 重置功能的计时器 并且 btn Reset 必须将我的计时器 暂停 到 300 毫秒 怎么做 D 我的启动定
  • 为 Firestore 创建的每个用户的自定义 UID

    请注意 这个问题与问题相同here https stackoverflow com questions 41155905 firebase authentication email password how to set users uid
  • 当动态列的 ng-prime 数据表中的行更新时如何更新行背景颜色?

    我想在行更新时更改行颜色 记录更新成功时如何设置行背景颜色 html
  • Jasmine:期望在异步函数中抛出错误

    我的 angular2 应用程序中有一个异步函数 我想为其编写单元测试 想象一下我的功能是这样的 myFunc a int Promise
  • 为什么我们需要`ngDoCheck`

    我似乎不明白为什么我需要ngDoCheck生命周期钩子除了用于简单的通知之外 特别是在其中编写代码如何对更改检测产生影响 我发现的大多数例子都显示了无用的例子 比如this one https juristr com blog 2016 0
  • 使用 setInterval 时 Angular2 视图未更新

    我正在使用 Angular2 RC5 我有一个奇怪的问题 在我的主要组件中 我在构造函数中用于测试目的 setInterval gt this test new Date getMilliseconds toString 500 我的模板中
  • Angular 2 从 styles.scss 扩展样式

    在 Angular 2 中 我的 CSS 类styles scss file FirstClass 我试图在组件的 SCSS 文件中扩展此类 例如 MyComponent scss like SecondClass extend First

随机推荐

  • PHP 中的分段错误(核心转储)

    好的 我正在 Ubuntu 上的命令行上运行 PHP 应用程序 它以 分段错误 核心转储 结束 我该如何从这里开始调试它 我很确定没有内存泄漏 因为我已经使用 get memory usage 检查过它 编辑 好吧 正如 Brendan 和
  • 什么决定(如何配置)php PDO 驱动程序对日期和时间戳字段的值使用什么格式字符串?

    我有 Firebird 3 0 数据库 其中包含日期和时间戳字段 并且我正在使用 interbase 扩展 是的 仍然是 interbase 和 PHP 7 x 中的 Yii2 框架 我有 Yii 代码 Yii app gt db gt c
  • Rails - 删除未保存的关联记录

    假设我有一个包含很多文章的用户模型 如果我多次调用 user articles new 我将有许多与该用户关联的未保存的文章对象 当您运行 user articles 时 它们是可见的 调用 user save 将保存所有未保存的记录 如何
  • 使用 LINQ 展平分层数据集 - 但需要注意

    我有以下数据集 需要将其展平为列表
  • Java 中的 RegEx:如何处理换行符

    我目前正在尝试学习如何使用正则表达式 所以请忍受我的简单问题 例如 假设我有一个输入文件 其中包含一堆由换行符分隔的链接 www foo com Archives monkeys htmMonkey 网站的描述 www foo com Ar
  • java.io.IOException:不支持标记/重置

    这段代码不起作用 我已经准备好一堂课了 因为它可以找到here http javafree uol com br topic 879623 Executar wav html 但音乐不起作用 我怎样才能解决这个问题 private void
  • 如何检查我的 Python Discord 机器人是否具有必要的权限?

    我制作了一个实用机器人来帮助记录消息并帮助将通道从一台服务器迁移到另一台服务器 我需要检查它是否具有执行命令所需的权限 但以下代码不起作用 我使用 client event并且不想使用 bot command 这是我的权限检查代码 if n
  • 如何在调用sqlcmd时更改端口

    我有这个命令 sqlcmd exe E i C joe db scripts joe db tasks Install sql 我需要添加特定的非标准端口 32001 我该怎么做 我在想一些像这样的标志 p或其他东西 但我不知道语法 根据这
  • 在select语句中显示表名

    我需要在 select 语句中显示表名 如何 确切的问题 我们在两个表中有公共列 我们正在使用以下方式显示记录 select column name from table name 1 union select column name fr
  • 如何使用 Google CardBoard Android SDK 和 Rajawali 制作一个简单的 VR 视频播放器

    我是这些领域的新人 我正在尝试改变一个program https github com ejeinc RajawaliCardboardExample现在在 github 中播放 Cardboard 视频 我使用 StreamingText
  • 为什么媒体查询的顺序在 CSS 中很重要?

    最近 我一直在设计响应速度更快的网站 并且经常使用 CSS 媒体查询 我注意到的一种模式是 定义媒体查询的顺序实际上很重要 我没有在每个浏览器中测试它 只是在 Chrome 上测试 这种行为有解释吗 有时 当您的网站无法正常工作并且您不确定
  • 数组中出现 NullPointerException

    我不断收到 NullPointerException 见下文 在 C 中一切正常 但在 android 中却崩溃了 arrDBNumbers 已满 代码应该运行并计算 1 2 3 等到 49 的数量 将 1 添加到 arrFreq i 1
  • Python - Flask:找不到 render_template() [重复]

    这个问题在这里已经有答案了 我是烧瓶新手 我有这个代码 你能给我一个建议吗 我做错了什么 谢谢 from flask import Flask from flask import request from flask import rend
  • Android:2个具有相同包的aar库

    Edit 基于此讨论的后续问题已发布在以下链接中 Android 如何管理同一应用程序使用的多个库中的公共代码库 https stackoverflow com questions 57572278 android how to manag
  • 我无法更改 static void Main(string[] args)

    我无法在控制台应用程序中更改 static void Main string args 谁能告诉我如何将其更改为其他内容 如果您的意思是无法将其更改为非静态的 或者无法更改其名称 那就对了 应用程序的入口点 must叫做Main must保
  • ASP.NET 部分回发期间打开时的 jQueryUI 日期选择器行为:年份变为 1899 或 1900

    我在 jQueryUI 日期选择器和 UpdatePanel 中遇到了一个非常有趣的错误 其中日期选择器选择的日期大约是 100 年后 jQuery 的版本为 1 6 2 jQueryUI 的版本为 1 8 14 这是粗略的布局
  • 了解事件循环

    我正在思考这个问题 这就是我想到的 我们看下面这段代码 console clear console log a setTimeout function console log b 1000 console log c setTimeout
  • 模式中的 Bootstrap 日期选择器不起作用

    我试图用谷歌搜索并搜索类似的问题 但到目前为止还没有找到任何东西 我有一个问题 我从 jquery 创建并打开模式并尝试访问日期选择器 但它不会激活日期选择器 JS id add click function myModal modal h
  • 在Java变量和方法名称中使用下划线[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 Angular2 中进行嵌套的 Observable 调用

    我在进行嵌套的 Observable 调用时遇到了一些麻烦 我的意思是调用一个 http 服务来检索用户 然后从用户处获取 id 以进行另一个 http 调用 最后在屏幕上呈现结果 1 HTTP GET 1 获取用户 2 HTTP GET