位置:首页 > web前端 > angular

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的基本用法以及常用的工具类方法,如果你觉得哪里讲的不对,可以私信,我们一起努力解决。

24人点赞 返回栏目 提问 分享一波

小礼物走一波,支持作者

还没有人赞赏,支持一波吧

留言(问题紧急可添加微信 xxl18963067593) 评论仅代表网友个人 留言列表

暂无留言,快来抢沙发吧!

本刊热文
网友在读
手机扫码查看 手机扫码查看