看个例子:

const myObservable = of(1, 2, 3);// 创建一个观察者对象-Observer(处理next、error、complete回调)const myObserver = {next: x => console.log('Observer got a next value: ' + x),error: err => console.error('Observer got an error: ' + err),complete: () => console.log('Observer got a complete notification'),};// 通过Observable的subscribe函数,观察者去订阅可观察者的消息myObservable.subscribe(myObserver);

调用Observable的subscribe方法,传入一个包含回调函数的observer对象:

后两个参数都是undefined:

在toSubscriber函数里,因为nextOrObserver是我手动传入的对象,所以前两个IF条件均不满足:

进入默认实现,新建一个Subscriber对象:

Subscriber是Subscription的子类:

我们现在的Subscriber的构造函数里,创建一个SafeSubscruber实例:this作为parent subscriber传入

EmptyObserver是从./Observer导入进来的:

从SafeSubscriber的实现能看出,传入的Observer对象的next,error和complete这些函数名称都是硬编码的,必须符合这个命名规范:


Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。

执行subscribe:

sink的destination包含了应用程序传入的complete, next, error逻辑:

这里能看到,subscribe的逻辑就是,遍历所有Observable参数,依次调用observer的next方法,最后再调用一次complete方法:

next调用私有的_next方法:

this._next调用this.destination.next:


最终调用到应用程序员传入的next方法:

最后的输出:

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

rxjs里的Observable对象subscribe方法的执行原理相关推荐

  1. 通过一个最简单的例子,理解Angular rxjs里的Observable对象的pipe方法

    源代码: import { of } from 'rxjs'; import { Injectable } from '@angular/core'; import { map } from 'rxj ...

  2. rxjs里的Observable对象和map配合的一个用法

    源代码: import { of } from 'rxjs'; import { Injectable } from '@angular/core'; import { map } from 'rxj ...

  3. rxjs里的Observable对象如何消费

    测试代码: import { of } from 'rxjs'; import { Injectable } from '@angular/core';@Injectable() export cla ...

  4. rxjs里b = a.pipe(map(mapFn))的执行示意图

  5. rxjs of操作符生成的Observable对象的执行详细分析

    代码: const a = of([1, 2, 3]); a.subscribe((data) => console.log('Fairy:' + data)); 单步调试,首先执行of所在的i ...

  6. Rxjs 里 subscribeToArray 工具函数的详细分析

    subscribeToArray 函数体的逻辑:它的实质是一个函数: 该函数接收一个 array 作为输入参数,遍历这个 array,将其每个元素,作为另一个匿名函数执行的一部分.该匿名函数体内,将 ...

  7. Selenium webdriver 新跳转页面上找对象解决方法

    Selenium webdriver 新跳转页面上找对象解决方法    在执行的测试的时候,需要验证跳转后新的web页面的对象,不是之前页面,用get()跳转后,在新页面找不到对象.   例如:之前是 ...

  8. 为什么Spartacus单元测试里对http返回的Observable对象调用subscribe时,会触发依赖注入的框架代码

    今天我工作发现,一旦下面单元测试代码第109行,即subscribe方法单步调试进去: 会触发HTTP请求真正的执行,即请求发送给服务器: 试图获取HTTP_INTERCEPTORS这个injecti ...

  9. 如何在Chrome调试器里检查嵌套Observable对象

    一个例子: 举个例子,看如下这个嵌套的Observable对象: items$: Observable<Observable<Product>[]> = this.compon ...

最新文章

  1. 空指针异常是什么原因_睡觉时,突然抖了一下,脚踏空,是什么原因?
  2. 美工一流的个人网站源码系列(2),不漂亮你可以不下载!
  3. Java的Covariance设计原理和SAP ABAP的模拟实现
  4. 160 - 22 CarLitoZ.1
  5. Oracle下的Databse,Instance,Schemas
  6. python面试题之docstring是什么?
  7. 通知 notification
  8. Ubuntu 安装 typora
  9. kotlin半生对象_Kotlin单一对象,Kotlin伴侣对象
  10. Android 中文API (69) —— BluetoothAdapter[蓝牙]
  11. java用ajax实现多级菜单,ajax + java + jsp 做的二级菜单联动(全)
  12. 计算机中丢失xvidcore.dll,出现xvidcore.dll not found 问题的解决方法
  13. 制作纯DOS启动U盘
  14. JAVA泛型-泛型方法的定义和使用
  15. missing required library libmysql_e.dll,126 解决办法
  16. jquery M97-datepicker日历控件
  17. 被面试官问到项目中的难点?是时候对自己的项目进行总结了(记一次项目问题总结)
  18. 定时任务管理系统 gocron
  19. 机器学习:SVM支持向量机理解
  20. Bugzilla的bug状态

热门文章

  1. 27、很酷的C语言技巧
  2. 饶过'(单引号)限制继续射入
  3. 机房系统(四)——【分页控件SSTab】
  4. Spring Cloud Config git版
  5. 【PMP】项目风险管理~重点知识
  6. 获取列表中的最大的N项和最小的N项
  7. 将Python文件打包为exe文件,并在控制台运行之简易教程
  8. Json-server 创建模拟API服务器
  9. v-show 与 v-if区别
  10. zhlan--Python中常见的几种格式化输出