Rxjs 操作符

1. javascript解决异步编程方案

解决javascript异步编程方案有两种,一种是promise对象形式,还有一种是是Rxjs库形式,Rxjs相对于Promise来说,有好多Promise没有的特性和功能,使用起来更便捷简单;

2. Rxjs 简单介绍

Rxjs 是Reactive Extensions JavaScript 的简写,响应式异步编程;同Promise对象一样,是解决JS异步编程的一种解决方案;

3. Rxjs使用

1. Rxjs是一个库,需要使用npm进行安装;


    // 安装rxjs

    npm install rxjs --save

    // 安装rxjs-compat, rxjs-compat软件包在v5和v6之间创建了一个api兼容层

    npm install rxjs-compat --save

2. Rxjs常用操作符

2-1. 创建操作符: fromEvent、 from、 of、 interval、 create

(1). fromEvent: 创建一个 Observable,该 Observable 发出来自给定事件对象的指定类型事件

// 获取html元素
const btnElem = document.querySelector(‘button#rxjsBtn‘);
// 创建按钮的点击事件为可观察对象
Rx.Observable.fromEvent(btnElem, ‘click‘)
.scan(count => count + 1, 0) // count为定义的变量;逗号后面的0为count的初始值;箭头后面的语句值为scan返回的值;
.subscribe((count) => {
    console.log(‘fromEvent‘ + count);
});

/// 第一次点击输出: fromEvent1;第二次点击输出fromEvent2;依次同理
(2). from: 将各种其他对象和数据类型转化为 Observables

const arrayData = [5, 6];
Observable.from(arrayData).pipe(
    scan((scanData, item) => scanData += item, 10),
    map((item) => item * 2),
).subscribe((data: any) => {
    console.log(‘from:‘ + data);

});

/// 浏览器输出 from:30 from:42
(3). of: 创建一个 Observable,它会依次发出由你提供的参数,最后发出完成通知。

Observable.of(‘value1‘, ‘value2‘)
.subscribe((data: any) => {
    console.log(‘of:‘ + data);
});

/// 浏览器输出 of:value1 of: value2
(4). interval: 返回一个无线自增的序列整数

const numbers = Rx.Observable.interval(1000);
numbers.subscribe(x => console.log(‘interval:‘+x));

/// 浏览器输出: interval:1 interval2 依次增加
(5). create: 创建Observable对象, 当观察者( Observer )订阅该 Observable 时,它会执行指定的函数

const obs = Observable.create((obsever) => {
      obsever.next(‘add‘);
      obsever.next(‘upt‘);
      obsever.complete(); // 代表完成,之后的语句将不再会被调用;;;
      obsever.next(‘del‘);
    });
    // 订阅观察者
    obs.map(data => data + ‘Map‘).subscribe((data: any) => {
      console.log(data);
    });
    /// 浏览器输出: addMap uptMap

2-2. 转换操作符 : Map、MergeMap、MapTo、Scan

(1). Map: 把每个源值传递给转化函数以获得相应的输出值

Rx.Observable.from([1, 2])
.map((item) => item * 2)
.subscribe((data: any) => { console.log(‘map:‘ + data);});

/// 浏览器输出: map: 2 map: 4
(2). MergeMap: 将每个源值投射成 Observable ,该 Observable 会合并到输出 Observable 中;;;;可用于串联请求

const mergeA = Observable.of(1, 2, 3);
const mergeB = mergeA.map(r => Observable.of(r)).mergeMap(r => r);
mergeB.subscribe(c => console.log(‘mergeMap:‘ + c));

/// 浏览器输出: mergeMap1 mergeMap2 mergeMap3
(3). MapTo: 类似于 map,但它每一次都把源值映射成同一个输出值。

Observable.of(1, 2, 3).mapTo(33).subscribe(data => {console.log(data);});

/// 浏览器输出: 3个55
(4). Scan: 对源 Observable 使用累加器函数, 返回生成的中间值, 可选的初始值

Rx.Observable.from([1, 2]).pipe(
  scan((acc, item) => acc += item, 10)) // acc为一个新变量,item为[1,2]中的每一项, 10为新变量acc的默认初始值;返回新生成的中间值acc reduce同理
  .subscribe(v => console.log(v))

///  浏览器输出 11  13

2-3. 数学和聚合操作符:reduce

(1). reduce: 和scan同理;只不过中间变量的值不会清0,会保留上一次源操作之后的得到的中间值;并且只会输出最后一个值;

Rx.Observable.from([1, 2]).pipe(
  reduce((acc, item) => acc += item, 10))
  .subscribe(v => console.log(v))

// 输出

13

2-4. 过滤操作符: filter、throttleTime

(1). filter: 数据进行过滤返回你想要的数据

import {Observable} from ‘rxjs‘;
import {filter} from ‘rxjs/internal/operators‘;

from([2, 3, 4]).pipe(
    filter(item => item <= 3))
    .subscribe(v => console.log(v))

// 浏览器输出: 2 3
(2). throttleTime: 在一定时间范围内不管产生了多少事件,它只放第一个过去,剩下的都将舍弃

实现: 一秒内不管有多少点击事件;只触发一次点击事件;,


const throttleElem = document.querySelector(‘#throttleElem‘);
    // 一秒内只触发一次点击事件
    Rx.Observable.fromEvent(throttleElem, ‘click‘)
      .throttleTime(1000)
      .scan(count => count + 1, 0)
      .subscribe(data => {
        console.log(‘点击了‘ + data + ‘次‘);
      });

原文地址:https://www.cnblogs.com/zero-zm/p/9911827.html

时间: 2024-07-31 09:55:49

Rxjs 操作符的相关文章

Angular 4+ Http

HTTP: 使应用能够对远端服务器发起相应的Http调用: 你要知道: HttpModule并不是Angular的核心模块,它是Angualr用来进行Web访问的一种可选方式,并位于一个名叫@angual/http的独立附属模块中:也就是说:使用http之前要引入此模块; 1.基本使用: import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; impo

Python爬取CSDN博客文章

之前解析出问题,刚刚看到,这次仔细审查了 0 url :http://blog.csdn.net/youyou1543724847/article/details/52818339Redis一点基础的东西目录 1.基础底层数据结构 2.windows下环境搭建 3.java里连接redis数据库 4.关于认证 5.redis高级功能总结1.基础底层数据结构1.1.简单动态字符串SDS定义: ...47分钟前1 url :http://blog.csdn.net/youyou1543724847/

RxJS之过滤操作符 ( Angular环境 )

一 take操作符 只发出源 Observable 最初发出的的N个值 (N = count). 如果源发出值的数量小于 count 的话,那么它的所有值都将发出.然后它便完成,无论源 Observable 是否完成. import { Component, OnInit } from '@angular/core'; import { range } from 'rxjs/observable/range'; import { take } from 'rxjs/operators/take'

RxJS过滤数据流操作符学习 (Filtering Operators)

1. 过滤类操作符的模式 很多时候,上游Observable对象吐出的数据,并不是下游关心的,这个时候我们需要把不需要的数据,过滤掉.在RxJS中,提供了这类过滤操作符来实现这种功能. 过滤类操作符最基本的功能就是对一个给定的数据流中的每个数据判断是否满足某个条件,如果满足就传递给下游,如果不满足就抛弃. 判断一个数据是否有资格进入下游,是根据 "判定函数"的返回值, true代表可以进入下游,否则就会被淘汰. 有的过滤类操作符还可以接受一个函数参数"结果选择器",

你必须知道的6个Rxjs的操作符

1.Concat const getPostOne$ = Rx.Observable.timer(3000).mapTo({id: 1}); const getPostTwo$ = Rx.Observable.timer(1000).mapTo({id: 2}); Rx.Observable.concat(getPostOne$, getPostTwo$).subscribe(res => console.log(res)); 合并多个observables,当你一次性subscribe的时候,

构建流式应用—RxJS详解

讲之前先说一点哈,插入的图片,不能正常显示,图片一半被遮盖了,如果想看,鼠标右击然后图片地址,图片另存为去看.如果有知道怎么解决的,可以在下面给我评论,我会及时的修改. 好啦,开始: 目录 常规方式实现搜索功能 RxJS · 流 Stream RxJS 实现原理简析 观察者模式 迭代器模式 RxJS 的观察者 + 迭代器模式 RxJS 基础实现 Observable Observer RxJS · Operators Operators ·入门 一系列的 Operators 操作 使用 RxJS

使用 RxJS 实现 JavaScript 的 Reactive 编程

简介 作为有经验的JavaScript开发者,我们会在代码中采用一定程度的异步代码.我们不断地处理用户的输入请求,也从远程获取数据,或者同时运行耗时的计算任务,所有这些都不能让浏览器崩溃.可以说,这些都不是琐碎的任务,它是确切的需求,我们学着去避开同步计算,让模型的时间和延时成为问题的关键.对于简单的应用程序,直接使用JavaScript的主事件系统,甚至使用jQuery库帮助也很常见.然而,还没有适当的模式来扩展的简单代码,解决这些异步问题,满足更丰富的应用特性,满足现代web用户的需求,这些

RxJS入门(3)----深入Sequence

在之前的系列中,我吧sequence翻译成了序列,题目我就不翻译了,感觉翻译过来的有点失去了点啥.其他好多地方都是用stream(流)来比喻和形容. 可视化Observable 在Rxjs编程中你已经学了一些关于使用最频繁的操作符了.讨论什么是sequence的操作符感觉有点抽象.为了帮助开发者更容易的理解操作符,我们使用marble diagrams(弹子图?翻译估计有问题)来标准可视化.他们很形象的代表了异步的数据流,并且你可以在其他的rxjs资料里面找到. 让我们看下range操作符,它返

RxJS入门(9)----调度(Bending Time with Schedulers)

如题,感觉题目没有翻译好,见英文知其义. 我一知道RxJS,我们开始把它用到我的项目中了.在一段时间后,我想,我知道能如何有效的使用它了,但是这里有一个令人心烦的问题:我如何知道使用的操作符是异步的还是同步的?换句话说,什么时候利用操作符准确的发送通知?这看起来是正确使用RxJs的机器重要的部分,但是这让我感觉很模糊. interval很明显是异步的,所以它必须在像setTimeout内部使用来发射值.但是如果使用range了?它也发射异步的?它是否阻止事件循环?from了?我曾经处处使用这些操