[译] 调试 RxJS 第2部分: 日志篇

原文链接:

https://blog.angularindepth.com/debugging-rxjs-part-2-logging-56904459f144 本文为 RxJS 中文社区 翻译文章,如需转载,请注明出处,谢谢合作! 如果你也想和我们一起,翻译更多优质的 RxJS 文章以奉献给大家,请访问下面链接:

https://github.com/RxJS-CN/rxjs-articles-translation

日志没什么可兴奋的。

然而,日志是获取足够信息以开始推断问题的直接方式,它不是靠猜的,而且它通常用于调试 RxJS 代码。

本文是调试 RxJS 系列文章的第二篇,继 调试 RxJS 第1部分: 工具篇之后,侧重于使用日志来解决实际问题。在本文中,我将展示如何以一种不唐突的方式来使用 rxjs-spy 获取详情和有针对性的信息。

来看一个简单示例,示例中使用的是 rxjs 和 rxjs-spy 的 UMD bundles:

示例中使用 forkJoin 来组成一个发出 GitHub 用户数组的 observable 。

rxjs-spy 对使用 tag 操作符标记过的 observables 起作用,tag 操作符使用字符串标签名来注释 observable,仅此而已。在组成 observable 之前,示例启用了侦察,并为匹配 /user-.+/ 正则表达式或标签名为 users 的 observable 配置日志记录器。

示例的输入看上去应该是这样的:

除了 observable 的 next 和 complete 通知,日志输出还包括了订阅和取消订阅的通知。它显示了所发生的一切:

  • 订阅组合 observable 会并行订阅每个用户 API 请求的 observable
  • 请求完成的顺序是不固定的
  • observables 全部完成
  • 全部完成后,组合 observable 的订阅会自动取消订阅

每个日志中的通知都包含接收该通知的订阅者 ( Subscriber )的信息,其中包括订阅者订阅的数量和 subscribe 调用的堆栈跟踪:

堆栈跟踪指向的是根源的 subscribe 调用,也就是 observable 订阅者的显式订阅。所以,用户请求 observables 的堆栈跟踪也指向 medium.js (译者注: 即上面的代码文件) 中的 subscribe 调用:

当调试时,我发现知道实际的 subscribe 调用地点比知道位于组合 observable 中间的 subscribe 调用地点更有用。

现在我们来看一个现实问题。

当编写 redux-observable 的 epics 或 ngrx 的 effects 时,我见过一些开发者的代码大概是这样的:

乍看上去没什么问题,而且大多数情况下也能正常运行。这种 bug 还是在单元测试里发现不了的。

问题就是有时候 epic 就会停止运行。再具体一点就是当 dispatch 了报错的 action 后它会停止运行。

日志显示了具体发生了什么:

发出报错的 action 后, observable 便完成了,因为 redux-observable 的基础设施取消了 epic 的订阅。catch 操作符的文档解释了这一现象发生的原因:

无论 selector 函数返回的 observable 是什么,都会被用来继续执行 observable 链。

在 epic 中,catch 返回的 observable 完成了,epic 也就完成了。

解决方法是将 map 和 catch 的调用移到 switchMap 里面,就像这样:

这样 epic 便不会完成,它会继续 dispatch 报错的 actions:

在这两个示例中,对于被调试的代码来说,唯一需要修改就是是添加了某个标记注释。

注释是轻量级的,只需添加一次,我倾向于将它们留在代码中。tag 操作符的使用可以独立于 rxjs-spy 中诊断功能,通过使用 rxjs-spy/add/operator/tag 或直接从 rxjs-spy/operator/tag 导入。所以保留标签的成本很小。

日志记录器可以使用正则表达式来配置,这会导致了多种可能性的标记。例如,使用像 github/users 和 github/repos 这样的复合标签就可以让所有标记名以 github 开头的 observables 启用日志。

日志没什么可兴奋的,但是从日志的输出中收集到的信息通常可以节省大量的时间。采用灵活的标记方法可以进一步减少处理日志相关代码的时间。

原文发布于微信公众号 - 较真的前端(gh_7af41a2be77e)

原文发表时间:2017-11-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏linux系统运维

linux任务计划, chkconfig工具,systemd管理服务, unit介绍,target介绍

1905
来自专栏Java成神之路

Tomcat_异常_02_IOException while loading persisted sessions: java.io.EOFException

     EOFException表示输入过程中意外地到达文件尾或流尾的信号,导致从session中获取数据失败。

751
来自专栏前端杂货铺

XSS分析及预防

XSS(Cross Site Scripting),又称跨站脚本,XSS的重点不在于跨站点,而是在于脚本的执行。在WEB前端应用日益发展的今天,XSS漏洞尤其容...

3397
来自专栏魏艾斯博客www.vpsss.net

网站目录/绝对路径/相对路径-零基础搭建wordpress教程

网站基本知识包括很多方面,网站结构、网页路径、域名、服务器、建站等等,我们已经写过域名和新手如何选择服务器了,正好最近遇到群友对网站基本知识有些疑问,魏艾斯博客...

3241
来自专栏北京马哥教育

马哥金牌分享 | 十五分钟实现Ansible常用模块入门

本文是马哥教育特约金牌讲师、Linux运维专家魏巍的分享《Anisble常用模块入门指南》的文字整理篇。 朋友们晚上好: 今天我为大家带来的分享是 Ansibl...

3995
来自专栏24K纯开源

QT程序在发布的时候应注意的地方

---恢复内容开始---     我们用QT开发好的应用程序,如果要发布到其他计算机上运行怎么办呢?我们在用VC编程时,单独运行编译好的可执行文件时,经常会发现...

2545
来自专栏DeveWork

通过多说服务器缓存加速Gravatar 头像,解决被墙问题

由于大中华局域网的关系,Gravatar 头像所在的域名gravatar.com 及其二级域常常被墙,就算没有被墙,访问速度也非常慢。之前曾经分享过通过《Wor...

23110
来自专栏数据和云

5分钟速成Oracle 12.2 RAC 专家(附ppt下载)

Oracle 12c 在RAC方面提出了很多新的解决方案和特性。这些方案和特性使得Oracle 集群在云和大数据的时代环境下,帮助企业用户上云更具优势。今天我们...

3925
来自专栏HaHack

化繁为简的企业级 Git 管理实战(二):多分支子模块持续集成

1782
来自专栏java一日一条

9 个使用前必须再三小心的 Linux 命令

Linux Shell/terminal 命令非常强大,即使一个简单的命令就可能导致文件夹、文件或者路径文件夹等被删除。

681

扫码关注云+社区