RxJs map operator 工作原理分析

简介: RxJs map operator 工作原理分析

使用一个例子来研究 map 操作符的工作原理。

推荐阅读本文之前,先浏览这篇文章RxJs fromEvent 工作原理分析以了解相关知识。

源代码:

import { Component, OnInit, Inject } from '@angular/core';

import { fromEvent, combineLatest } from 'rxjs';

import { mapTo, startWith, scan, tap, map } from 'rxjs/operators';

import { DOCUMENT } from '@angular/common';

@Component({

 selector: 'app-combine-latest',

 templateUrl: './combine-latest.component.html'

})

export class CombineLatestComponent implements OnInit {

 readonly document: Document;

 constructor(

   // https://github.com/angular/angular/issues/20351

   @Inject(DOCUMENT) document: any) {

     this.document = document as Document;

   }

 redTotal:HTMLElement;

 blackTotal: HTMLElement;

 total:HTMLElement;  

 test:HTMLElement;

 ngOnInit(): void {

   this.redTotal = this.document.getElementById('red-total');  

   this.blackTotal = this.document.getElementById('black-total');

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

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

   combineLatest(this.addOneClick$('red'),  

 

   this.addOneClick$('black')).subscribe(([red, black]: any) => {

     this.redTotal.innerHTML = red;

     this.blackTotal.innerHTML = black;

     this.total.innerHTML = red + black;

   });

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

 }

 addOneClick$ = id =>

 fromEvent(this.document.getElementById(id), 'click').pipe(

   // map every click to 1

   mapTo(1),

   // keep a running total

   scan((acc, curr) => acc + curr, 0),

   startWith(0)

 );

} image.png

先缕一缕顺序:

  1. 首先执行fromEvent,返回一个 Observable 对象。
  2. 执行 map 操作符,其结果作为输入,传入 pipe
    image.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.png
  3. 只是返回一个新的 Observable 对象,其 source 属性指向调用 lift 操作的原始 Observable 对象,而 operator 属性指向 new MapOperator 返回的结果,后者是 project 的 wrapper.


如此一来,调用 subscribe 方法注册应用程序监听函数的 Observable 对象,再也不是 fromEvent 返回的原始 Observable 对象,而是前者调用了 pipe,接收了 map 指定的 project 之后,由 source.lift( new MapOperator) 返回的新 Observable 对象。

image.png

image.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.png

这段代码,定义了 fromEvent,以什么样的方式,emit 何种类型的数据。

  • 什么样的方式?addEventListener,每次 eventTarget 定义的 HTMLElement 发生 click 事件时,emit 数据
  • emit 的数据格式为 MouseEvent.image.png
  • 至此 Observable 相关的 setup 执行完毕。


点击按钮,触发之前通过 addListener 注册的 handler 函数。fromEvent.js 此处 subscriber 不是原始的 subscriber,而是 MapSubscriber,其 destination 属性的 _next, 指向了应用程序指定的订阅处理逻辑。Emit 的数据是 MouseEvent.

image.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.png

目录
相关文章
|
6月前
|
数据库连接 数据库
RxJs 里的 using operator 的使用场景介绍
RxJs 里的 using operator 的使用场景介绍
25 0
|
7月前
|
前端开发
rxjs Observable 设计原理背后的 Pull 和 Push 思路
rxjs Observable 设计原理背后的 Pull 和 Push 思路
27 0
|
7月前
|
JavaScript
rxjs Observable filter Operator 的实现原理介绍
rxjs Observable filter Operator 的实现原理介绍
43 0
|
7月前
|
存储
rxjs Observable 自定义 Operator 的开发技巧
rxjs Observable 自定义 Operator 的开发技巧
36 0
|
7月前
|
API
Rxjs map, mergeMap 和 switchMap 的区别和联系
Rxjs map, mergeMap 和 switchMap 的区别和联系
50 1
|
索引
从underscore源码看如何实现map函数
经常会看到这样的面试题,让面试者手动实现一个 map 函数之类的,嗯,貌似并没有什么实际意义。但是对于知识探索的步伐不能停止,现在就来分析下如何实现 map 函数。
71 0
从underscore源码看如何实现map函数
|
存储 JavaScript 算法
一文搞懂reduce的用法和使用场景!
前言 JavaScript 中的数组操作方法有好几十种,有的很简单,有的稍显复杂。而今天我们单独拿出来讲的便是 reduce 方法,为什么单独把 reduce 拿出来说呢?因为它算是 JS 数组方法里面较为复杂的一个了,而且很多面试官非常喜欢让面试者手动实现 reduce,所以我们有必要好好学一学这个数组方法,本篇文章主要是以学习 reduce 为主,后续会推出手写 reduce 的文章。
475 0
一文搞懂reduce的用法和使用场景!
|
前端开发 JavaScript 数据处理
RxJs合并接口应用案例
RxJs合并接口应用案例
163 0
|
Dart
dart编程之map基础
在 Dart 编程中,Map 是类似字典的数据类型,以键值形式(称为锁键)存在。map数据类型中的数据类型没有限制。map非常灵活,可以根据需求改变其大小。但是,需要注意的是,所有锁(键)在map数据类型中都必须是唯一的。
209 0