Angular2 查询参数订阅触发两次

2024-03-27

尝试处理 OAuth 登录场景,其中如果用户登陆页面authorization_code在查询字符串中,我们处理令牌并继续or如果他们在没有该令牌的情况下登陆页面,我们会检查本地存储中是否存在现有令牌,确保其仍然有效,并根据其有效性重定向到登录或继续。

问题是我们在哪里检查是否存在authorization_code查询字符串参数,订阅触发两次。第一次它是空的,第二次它在字典中具有正确的值。

应用程序组件.ts

export class App implements OnInit {
    constructor(private _router: ActivatedRoute) {
    }

    public ngOnInit(): void {
        console.log('INIT');
        this._route.queryParams.subscribe(params => {
            console.log(params);
        });
    }
}

This code outputs: output

Plunker https://plnkr.co/edit/XgCauzZdTSqqokCdFWCi?p=preview(您需要将其弹出到新窗口中并添加查询字符串?test=test).

问题

  1. 难道是我做错了什么才让它着火两次?
  2. 我不能只是忽略带有条件的空对象,因为这是我们需要验证现有身份验证令牌的场景 - 是否有另一种方法来解决这个问题,而不是一个完整的黑客?

路由器可观察量(正如另一个答案提到的)are BehaviorSubject科目 https://github.com/angular/angular/blob/2.0.1/modules/%40angular/router/src/router_state.ts#L65-L70,它们与常规 RxJS 不同Subject或角度 2EventEmitter因为它们将初始值推送到序列中(在以下情况下为空对象)queryParams).

一般来说,使用初始化逻辑进行订阅的可能性是可取的。

可以跳过初始值skip操作员。

this._route.queryParams
.skip(1)
.subscribe(params => ...);

但处理这个问题的更自然的方法是过滤掉所有不相关的参数(初始参数)params属于这一类)。复制authorization_code值也可以过滤distinctUntilChanged操作员以避免对后端不必要的调用。

this._route.queryParams
.filter(params => 'authorization_code' in params)
.map(params => params.authorization_code)
.distinctUntilChanged()
.subscribe(authCode => ...);

请注意,Angular 2 导入了有限数量的 RxJS 运算符(至少map如果是@angular/router)。如果满了rxjs/Rx未使用捆绑包,可能需要导入额外的运算符(filter, distinctUntilChanged)正在使用import 'rxjs/add/operator/<operator_name>'.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular2 查询参数订阅触发两次 的相关文章

随机推荐

  • 模块“QtQuick.Dialogs”版本 1.3 未安装

    我正在尝试在运行 1 2 版时没有任何问题的代码中导入 QtQuick Dialogs 1 3 版 但是在运行时我收到以下错误 模块 QtQuick Dialogs 版本 1 3 未安装 我正在使用默认的 Desktop Qt 5 9 2
  • 如何安全地读取 ASP.NET 中的流?

    byte bytes new byte uploader UploadedFiles 0 InputStream Length uploader UploadedFiles 0 InputStream Read bytes 0 bytes
  • Eclipse makefile 构建速度很慢...是什么原因?

    我们是 Eclipse 的狂热粉丝 这太棒了 但我们有大约 40 个 C 项目 并且还在不断增长 当所有项目都是最新的时 构建所有这些项目大约需要半分钟 总共 如果我只是创建一个对所有 40 个项目执行 make all 的 bash 脚本
  • 为什么 golang 左移 64 位不会溢出?

    我正在看围棋之旅 https tour golang org basics 11我对 basic types go 示例中的某些内容感到困惑 MaxInt uint64 1 lt lt 64 1 在无符号 64 位整数中向左移动 1 64
  • React 测试库:何时使用 userEvent.click 以及何时使用 fireEvent

    我目前正在学习 React Testing Library 我想测试鼠标与元素的交互 目前我还不清楚 userEvent click element 和 fireEvent click element 之间的区别 两者都建议使用吗 在下面的
  • 无法连接到生产 Apple 推送通知服务器

    我们使用开发认证和 gateway sandbox push apple com 向配置的设备发送通知没有任何问题 但现在我们的应用程序已在商店中 看来我们甚至无法连接到生产 apn 服务器 gateway push apple com 来
  • Android singletop 单实例和单任务

    我在为不同的活动实现不同类型的启动模式时遇到设计问题 我有 5 项活动 视频列表 视频详情 收藏夹列表 视频搜索 视频播放器 当用户启动应用程序时 它会转到显示视频列表的 VideoList 单击任何视频会将它们带到视频详细信息 该页面中有
  • 使用 JSoup 提取 HTML 表格内容

    如何提取位于以下位置的表的内容 id 2 year 2012 acc conference gt http espn go com mens college basketball conferences stands id 2 year 2
  • 如何使用EMGU CV获取人脸识别的置信度值?

    我正在开发一个项目 其中我应该设计一个应用程序 可以检测路过的人的所有面孔 我有一个非常大的数据库 其中包含几个已知的人 我使用 EigenObjectRecognizer 来识别图像网络摄像头捕获的帧 但问题是有时它会错误地识别某些人 因
  • 如何使用 apply、map 或 applymap 查找 pandas dataframe 中的每一行和每一列数据类型?

    我有如图所示的数据框 我希望每行和列的数据类型都使用 apply map applymap 如何获取这个数据类型 有些列具有混合数据类型 如突出显示的 例如list 和 str 有些有 list 和 dict 示例 pandas 数据框 1
  • 有没有办法在参数替换后从 SqlCommand 获取完整的 sql 文本?

    我创建了一个带有包含参数的 SQL 查询的 SqlCommand 然后我将所有参数添加到类中 在将 SQL 查询发送到数据库之前 是否有一种简单的方法可以查看生成的 SQL 查询 这对于调试目的来说会很方便 例如 复制整个查询并在管理工作室
  • main.cpp:(.text+0x5f): 未定义的引用

    我尝试从 SDL 指南中编写一些练习 我这样编译 g o main main cpp I usr local include SDL2 L usr local lib lSDL2 我得到这个 tmp cci2rYNF o In functi
  • ASP.Net MVC:如何读取我的自定义声明值

    请参阅下面的代码 我知道通过这种方式我们可以将自定义数据添加到索赔中 但现在的问题是如何读回这些值 假设我想读回索赔价值电子邮件和电子邮件2请告诉我需要编写什么代码来读回索赔值电子邮件和电子邮件2 UserManager
  • 如何每秒运行一个 Runnable 来更新 UI

    我正在尝试在 kotlin android 中编写代码以每秒移动一个图像 但我无法使其工作 现在我正在使用Timer安排一个Timer Task每秒 但它没有按预期工作 这是我的代码 class Actvt Image
  • 使用 Google Pretify 显示 HTML

    为了让 Google Prettify 正确显示 HTML 代码示例 您应该替换所有 lt with lt 和所有的 gt with gt 如何仅使用 JavaScript 来自动化该过程 如果您将代码放入
  • 使用 Oracle SQL Developer 查询两个数据库

    有没有办法在 Oracle SQL Developer 中查询两个数据库 在单个查询中 我对 Oracle 不太熟悉 无论如何 除了标准的 CRUD 语法 我正在尝试从 SQL Server 表插入 Oracle 表 想做这样的事情 INS
  • 使用 CSS 显示徽标的正确方法是什么?

    我最近一直在学习CSS 我正在观看的教程系列说显示徽标图像的最佳方法是将文本包装在H1标签中 然后将该标签的CSS样式设置为背景图像 并带有文本缩进 99999 或类似的大数字 这看起来非常粗俗和不优雅 对于 SEO 目的来说 使用 CSS
  • 如何检查 NSString 是否包含数字值?

    我有一个从公式生成的字符串 但是我只想使用该字符串 只要它的所有字符都是数字 如果不是 我想做一些不同的事情 例如显示错误消息 我一直在环顾四周 但发现很难找到任何符合我想做的事情 我看过 NSScanner 但我不确定它是否检查整个字符串
  • 在python中将字节转换为文件对象

    我有一个小应用程序 它使用以下方式读取本地文件 open diefile path r as csv file open diefile path r as file and also uses linecache module 我需要将用
  • Angular2 查询参数订阅触发两次

    尝试处理 OAuth 登录场景 其中如果用户登陆页面authorization code在查询字符串中 我们处理令牌并继续or如果他们在没有该令牌的情况下登陆页面 我们会检查本地存储中是否存在现有令牌 确保其仍然有效 并根据其有效性重定向到