rxjs介绍与使用 常用的工具类方法
dearweb 发布:2021-08-26 22:22:41阅读:rxjs是reativeX编程理念的javascript版本,是一种针对异步数据流的编程,简单来说它将一切数据包括HTTP请求,DOM事件或者普通数据等包装成流的形式,然后用强大丰富的操作符对流进行处理,使你能以同步编程的方式处理异步数据,并组合不同的操作符来轻松优雅的实现你所需要的功能。
RxJS是一种针对异步数据流编程工具,或者焦灼响应式扩展变化出了个,可不管如何解释RxJS其目标就是异步编程,Angular引入RxJS为了就是让异步可控、更简单。
RxJS里面提供了很多模块。下面主要给大家讲RxJS里面最常用的Observable和fromEvent。
常见的异步编程的几种方法:
· 回调函数
· 事件监听/发布订阅
· Promise
· RxJS
服务里面获取异步数据的代码
import { Injectable } from '@angular/core'; // 引入rxjs import {Observable} from 'rxjs' @Injectable({ providedIn: 'root' }) export class StorageService { public cll:string = 'wuhan' constructor() { } get(){ return 'this a storage' } // 回调函数获取参数 // getCallBack(cb:any){ // setTimeout(()=>{ // let name = "张三" // cb(name) // },1000) // } // promise获取数据 // getCallBack(){ // return new Promise((resole,reject)=>{ // setTimeout(()=>{ // let name = "张三" // resole(name) // },1000) // }) // } // RxJS获取异步数据 getCallBack(){ return new Observable<any>((observer)=>{ setTimeout(()=>{ let name="李四" observer.next(name) // 成功返回 // observer.error(name) // 失败返回 }) }) } }
组件中获取服务里面数据的代码
import { Component, OnInit } from '@angular/core'; import {StorageService} from '../../services/storage.service' @Component({ selector: 'app-rxjs', templateUrl: './rxjs.component.html', styleUrls: ['./rxjs.component.scss'] }) export class RxjsComponent implements OnInit { constructor(public requestData:StorageService) { } ngOnInit(): void { // 回调函数获取数据 // this.requestData.getCallBack((data:any)=>{ // console.log(data) // }) // promise获取异步数据 // let promiseData = this.requestData.getCallBack() // promiseData.then((res:any)=>{ // console.log(res) // }) // RxJS获取异步数据 let rxjsData = this.requestData.getCallBack() rxjsData.subscribe((res:any)=>{ console.log(res) }) } }
上述例子可以看到RxJS和Promise的基本用法非常类似,除了一些关键词不同,Promise里面使用的then()和resolve(),而RxJS里面用的是next()和subscribe()。
相比于promise,RxJS要更加强大一点,比如可以中途撤回、RxJS可以发射多个值,RxJS提供了多种工具函数等等。
Rxjs里面的unsubscribe取消订阅功能
promise创建之后,动作是无法撤回的,Observable不一样,动作可以通过unsbscribe()方法中途撤回,而Observable在内部做了智能的处理
// 过1s撤回刚才的操作 let streem = this.requestData.getCallBack() let d = streem.subscribe((res)=>{ console.log(res) }) // 取消订阅 setTimeout(()=>{ d.unsubscribe() },1000)
Rxjs里面订阅后多次执行
这一点promise是做不到的,对于promise来说,最终的结果要么resole,要么reject,而且智能触发一次,如果在同一个promise对象上多次调用resole方法,则会抛出异常,而Observable不一样,他可以不断地触发下一个值,就像next()这个方法的名字所暗示的一样。
import { Injectable } from '@angular/core'; // 引入rxjs import {Observable} from 'rxjs' @Injectable({ providedIn: 'root' }) export class StorageService { public cll:string = 'wuhan' constructor() { } // 多次执行 getCallBack(){ let count = 0 return new Observable<any>((observer)=>{ setInterval(()=>{ count++ let name="李四"+count observer.next(name) // 成功返回 // observer.error(name) // 失败返回 },1000) }) } }
组件中的代码
import { Component, OnInit } from '@angular/core'; import {StorageService} from '../../services/storage.service' @Component({ selector: 'app-rxjs', templateUrl: './rxjs.component.html', styleUrls: ['./rxjs.component.scss'] }) export class RxjsComponent implements OnInit { constructor(public requestData:StorageService) { } ngOnInit(): void { // 订阅后多次执行 // RxJS获取异步数据 let rxjsData = this.requestData.getCallBack() rxjsData.subscribe((res)=>{ console.log(res) }) } }
Rxjs里面提供的工具函数map filter
angular6以后使用以前的RxJS方法,必须安装rxjs-compat模块才能使用map、filter方法,angular6以后官方使用的是RxJS6的新特性,所以官方给出了一个可以暂时延缓我们不需要修改RxJS代码的方法。
import { Component, OnInit } from '@angular/core'; import {StorageService} from '../../services/storage.service' import {map,filter } from 'rxjs/operator'; // 引用工具类方法 @Component({ selector: 'app-rxjs', templateUrl: './rxjs.component.html', styleUrls: ['./rxjs.component.scss'] }) export class RxjsComponent implements OnInit { constructor(public requestData:StorageService) { } ngOnInit(): void { // 使用工具类处理数据 let rxjsData = this.requestData.getCallBack() rxjsData.pipe( filter((value:any)=>{ if(value%2 == 0){ return true } }) ).subscribe((res)=>{ console.log(res) }) rxjsData.pipe( map((value:any)=>{ return value * value }) ).subscribe((res)=>{ console.log(res) }) } }
上面给大家讲解了rxjs的基本用法以及常用的工具类方法,如果你觉得哪里讲的不对,可以私信,我们一起努力解决。
小礼物走一波,支持作者
赏还没有人赞赏,支持一波吧