angularJS -- RXJS 的用法


JS -- 獲取異步數據的方式:

  1. 回調函數

  2. Promise

  3. 事件訂閱

  4. RxJS -- V6.0 +

1. 回調函數方式獲取異步數據

延時器模擬異步數據:

getCallData(cb) {
    setTimeout(() => {
      var userName = "ABC"
      cb && cb(userName)
    }, 1000);
  }

調用:

    /*
            回調函數獲取異步數據
        */
        this.request.getCallData((data: any)=>{
            console.log(data"回調函數方式獲取異步數據")
        })

 

2. Promise 獲取異步數據

promise 對象 resolve 數據,reject 返回錯誤:

 getPromiseData() {
    return new Promise((resolvereject)=>{
      setTimeout(() => {
        var userName = "promise-data"
        resolve(userName)
     reject(err)
      }, 1000);
    })
  }

調用:

    /*
            Promise 獲取異步數據
        */
        let promiseData = this.request.getPromiseData()
        promiseData.then((data)=>{
            console.log("promise 獲取異步數據:"data)
        })

 

3. Rxjs 獲取異步數據

定義方法時,return 出一個 Observable 對象, 通過 .next(data) 拋出數據, .error(錯誤信息) 拋出錯誤

import { Observable } from 'rxjs'
 
getRxjsData() {
    return new Observable((observer)=>{
      setTimeout(() => {
        var userName = "RXJS-data"
        observer.next(userName)
      }, 3000);
      
    })
  }

調用-接收時,通過 subscribe 訂閱:

     /*
            RXjs 獲取異步數據
        */
        let rxjsData = this.request.getRxjsData()
        let d = rxjsData.subscribe((data)=>{
            console.log("rxjs 獲取異步數據"data)
        })

 


Promise 和 rxJS 對比:

1. promise 方式,不能中斷。而RxJs方式可以打斷

實例:

     /*
            RXjs 獲取異步數據
        */
        let rxjsData = this.request.getRxjsData()
        let d = rxjsData.subscribe((data)=>{
            console.log("rxjs 獲取異步數據"data)
        })
        // rxjs 訂閱取消 - 1秒后打斷,不返回數據
        setTimeout(()=>{
            // d.unsubscribe()
        }, 1000)

2. interVal 多次執行 promise 只能執行一次,而 RxJS 可以多次執行

promise interval 實例:

定義:

 // 多次執行 promise
  getPromiseIntervalData() {
    return new Promise((resolvereject)=>{
      setInterval(() => {
        var userName = "promise-data-interval"
        resolve(userName)
      }, 1000);
    })
  }

調用:

 /**
         * 多次執行promise, 只執行一次
         */
        let promiseIntervalData = this.request.getPromiseIntervalData()
        promiseIntervalData.then((data)=>{
            console.log("promise-interval 獲取異步數據:"data)
        })

RxJS interval 實例:

定義:

 // 多次執行 rxjs
  getRxjsIntervalData() {
    return new Observable((observer)=>{
      setInterval(() => {
        var userName = "RXJS-data-interval"
        observer.next(userName)
      }, 1000);
      
    })
  }

調用:

    /**
         * 多次執行rxjs, 正常執行
         */
        let rxjsIntervalData = this.request.getRxjsIntervalData()
        rxjsIntervalData.subscribe((data)=>{
            console.log("RXJS-interval 獲取異步數據:"data)
        })

 


 


 

angular 中的 rxjs 的工具函數 -- filter, map

申明:

 
import { Observable } from 'rxjs'
// rxjs 申明 Observable 對象
  getRxjsUtilsData() {
    let count = 0
    return new Observable((observer)=>{
      setInterval(() => {
        count++
        observer.next(count)
      }, 1000);
    })
  }

工具方法的使用:

  
    import { filter,map } from 'rxjs/operators'
    
    /*
            rxjs 提供的工具方法-filter
        */
        let stream = this.request.getRxjsUtilsData()
        stream.pipe(
            filter((value: any)=>{
                if(value%2==0) {
                    return true
                }
            })
        ).subscribe((data)=>{
            console.log("RXJS-filter數據:"data)
        })
      
        /*
            rxjs 提供的工具方法-map
        */
        let stream = this.request.getRxjsUtilsData()
        stream.pipe(
            map((value: any)=>{
                return value*value
            })
        ).subscribe((data)=>{
            console.log("RXJS-map數據:"data)
        })
        /* 
            rxjs 提供的工具方法-map,filter 管道連寫
        */
        let stream = this.request.getRxjsUtilsData()
        stream.pipe(
            filter((value: any)=>{
                if(value%2 == 0) {
                    return true
                }
            }),
            map((value: any)=>{
                return value*value
            })
        ).subscribe((data)=>{
            console.log("RXJS-工具方法處理數據:"data)
        })

 


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM