RxJs fromEvent 工作原理分析

fromEvent(this.test, 'click').subscribe((event) => console.log(event));

this.test 的赋值逻辑:

this.test = this.document.getElementById('test');

每当该 id 为 test 的按钮被点击一次,则 fromEvent issue 一个新的值,内容为 MouseClick 事件:

本文介绍这个神奇的 fromEvent 的工作原理。

在 rxjs/_esm2015/index.js 下能看到所有 rxjs 支持的 operators:

fromEvent 构造函数支持最多 4 个输入参数,但我的例子里,之传入了两个。因此直接进入 Observable 对象的构造逻辑:

Observable 的构造函数,只有一个输入参数,该输入参数为一个函数。这个函数是一个匿名函数,只有函数体而无函数名称。

把该匿名函数维护在 Observable 的私有属性 _subscribe 里。

fromEvent 返回一个可观察对象,调用该对象的 subscribe 方法,给其注册观察者。

上图 observerOrNext 就是我们应用程序里,传入给 subscribe 方法的匿名函数,即使用 console.log 打印 id 为 test 的 button 被点击之后抛出的 MouseEvent 事件。

因为我们暂时没有给 fromEvent 返回的 Observable 对象指定 operator,因此第 20 行 operator 为 undefined:

调用函数 toSubscriber 创建一个新的 subscriber:

上图 nextOrObserver 就是我应用程序里指定的 console.log(event) 匿名函数,只是用 Subscriber 包了一层。

Subscriber.js 内部:Subscriber 的 destination 属性,指向了 SafeSubscriber 实例:

再回到 Observable 的 subscribe 方法。现在我们知道了,在其 toSubscriber 方法里,创建了一个 Subscriber 实例,其重要属性如上图1,2,3所示。因为没有为该 Observable 指定 operator,所以第 22 行的 IF 分支进不去,而是执行第 26 行的 else 分支。

进入 trySubscribe 方法:

_trySubscribe 是 _subscribe 方法的包裹,再加上错误处理:

文章开头提到的 Observable 私有属性 _subscribe, 指向 fromEvent.js 第14行匿名函数:

现在执行该匿名函数,函数体内 setupSubscription.

如何判断传进来的变量是 EventTarget 呢?

检查其是否具有 addEventListner 和 removeEventListener 即可。

这里把 fromEvent.js 里某个 handler 函数,作为按钮点击后的事件处理函数进行注册。

注意,这里给 click 点击事件注册的,并不是我们应用程序指定的 console.log(event), 而是 fromEvent.js 里一个内部函数,如下图所示:

当我点击 UI 的 test 按钮后,触发 click 事件,fromEvent.js 里定义的事件处理函数被调用:

还记得我们之前提到的 toSubscriber 函数调用么?将应用程序定义的 console.log(event), 包装成 SafeSubscriber,存储到 _next 属性里。

这里,最终触发 subscriber 的私有属性 _next 指向的应用程序处理逻辑:

使用了 JavaScript function 原生的 call 方法进行调用:

最终,进入了应用程序打印代码执行,谜底就此解开:

(0)

相关推荐

  • 隔空操作网页,web前端如何玩手部捕捉?

    案例一个非常简单的库,几行代码即可让网页可以捕捉手部,代码: import * as handTrack from 'handtrackjs'; // Returns a promise handTr ...

  • [周汇总] 前端面试每日3+1(周汇总2019.11.10)

    <论语>,曾子曰:"吾日三省吾身"(我每天多次反省自己). 前端面试每日3+1题,以面试题来驱动学习,每天进步一点! 让努力成为一种习惯,让奋斗成为一种享受! 相信 坚 ...

  • Bobril-VI-BobX应用程序商店管理

    BobX是类似于MobX的库,用于管理由BorisLetocha(Quadient)创建的应用程序商店.它是用TypeScript编写的,适合bobril应用程序的需求.它使用观察者模式,其中存储是可 ...

  • RxJs map operator 工作原理分析

    使用一个例子来研究 map 操作符的工作原理. 推荐阅读本文之前,先浏览这篇文章RxJs fromEvent 工作原理分析以了解相关知识. 源代码: import { Component, OnIni ...

  • 24V开关电源电路构成几工作原理分析

    电路以UC3842振荡芯片为,构成逆变.整流电路.UC3842一种高性能单端输出式电流控制型脉宽调制器芯片,相关引脚功能及内部电路原理已有介绍,此处从略.AC220V电源经共模滤波器L1引入,能较好抑 ...

  • 开关电源工作原理分析及图解

    描述 开关电源就是用通过电路控制开关管进行高速的导通与截止. 将直流电转化为高频率的交流电提供给变压器进行变压,从而产生所需要的一组或多组电压!转为高频交流电的原因是高频交流在变压器变压电路中的效率要 ...

  • BUCK电路工作原理分析详细阐述

    在电子电路中,电源一般分为两类,一类是线性电源,一类是开关电源.线性电源具有噪声小的优点.开关电源虽然噪大,但是具有效率高.热损小的优点. 开关电源还可以细分为降压型.升压型和升降压三类.也可按照隔离 ...

  • 8K视频指的什么?8K视频处理和工作原理分析

    随着视频技术的不断发展,分辨率从480P发展到1080P;当我们还没有完全意识到4K电视将一统天下的时候, 8K的直播就已开始.8K视频要求需要处理每帧约33M像素的数据量,海量的数据处理为目前的视频 ...

  • 海尔变频空调控制电路工作原理分析

    在控制电路板中应用了一片型号为CMC93-0057微处理器芯片,它是整个控制电路板的核心器件,海尔KFR35GW变频空调的运行控制信号都是由这个芯片发出的.CMC93-0057微处理器芯片主要引脚功能 ...

  • 直流变频空调的工作原理分析(图)

    前言:下图为变频空调变频部分的基本构成.电源220V交流电压经转换器变换为直流.逆变器主要功能为实现换向,把直流电压转换成任意频率的有效值相当于三相交流电的脉冲电压信号;其最常见的结构形式是六个半导体 ...

  • 485通信自动收发电路工作原理分析

    简单介绍 485接口电路

  • 三极管工作原理分析,精辟、透彻,看后你就懂

    说明:内容与之前那篇一样,由于之前那篇是转载百度的,现在图片受限,无法阅读.这篇自己添加了图片资源. 随着科学技的发展,电子技术的应用几乎渗透到了人们生产生活的方方面面.晶体三极管作为电子技术中一个最 ...