• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    angular.js4使用 RxJS 處理多個 Http 請求

    來源:懂視網 責編:小采 時間:2020-11-27 22:29:01
    文檔

    angular.js4使用 RxJS 處理多個 Http 請求

    angular.js4使用 RxJS 處理多個 Http 請求:有時候進入某個頁面時,我們需要從多個 API 地址獲取數據然后進行顯示。管理多個異步數據請求會比較困難,但我們可以借助 Angular Http 服務和 RxJS 庫提供的功能來實現上述的功能。處理多個請求有多種方式,使用串行或并行的方式。 基礎知識 merge
    推薦度:
    導讀angular.js4使用 RxJS 處理多個 Http 請求:有時候進入某個頁面時,我們需要從多個 API 地址獲取數據然后進行顯示。管理多個異步數據請求會比較困難,但我們可以借助 Angular Http 服務和 RxJS 庫提供的功能來實現上述的功能。處理多個請求有多種方式,使用串行或并行的方式。 基礎知識 merge

    有時候進入某個頁面時,我們需要從多個 API 地址獲取數據然后進行顯示。管理多個異步數據請求會比較困難,但我們可以借助 Angular Http 服務和 RxJS 庫提供的功能來實現上述的功能。處理多個請求有多種方式,使用串行或并行的方式。

    基礎知識

    mergeMap

    mergeMap 操作符用于從內部的 Observable 對象中獲取值,然后返回給父級流對象。

    合并 Observable 對象

    const source = Rx.Observable.of('Hello');
    //map to inner observable and flatten
    const example = source.mergeMap(val => Rx.Observable.of(`${val} World!`));
    
    const subscribe = example.subscribe(val => console.log(val)); //output: 'Hello World!'
    
    

    在上面示例中包含兩種 Observable 類型:

  • 源 Observable 對象 - 即 source 對象
  • 內部 Observable 對象 - 即 Rx.Observable.of(`${val} World!`) 對象
  • 僅當內部的 Observable 對象發出值后,才會合并源 Observable 對象輸出的值,并最終輸出合并的值。

    forkJoin

    forkJoin 是 Rx 版本的 Promise.all(),即表示等到所有的 Observable 都完成后,才一次性返回值。

    合并多個 Observable 對象

    const getPostOne$ = Rx.Observable.timer(1000).mapTo({id: 1});
    const getPostTwo$ = Rx.Observable.timer(2000).mapTo({id: 2});
    
    Rx.Observable.forkJoin(getPostOne$, getPostTwo$).subscribe(
     res => console.log(res) // [{id: 1}, {id: 2}]
    ); 
    

    處理 Http 請求

    我們先來看一下 Angular Http 服務簡單示例。

    import { Component, OnInit } from '@angular/core';
    import { Http } from '@angular/http';
    
    import 'rxjs/add/operator/map';
    
    @Component({
     selector: 'app-root',
     template: `
     <p>HttpModule Demo</p>
     `
    })
    export class AppComponent implements OnInit {
     constructor(private http: Http) { }
    
     ngOnInit() {
     this.http.get('https://jsonplaceholder.typicode.com/users')
     .map(res => res.json())
     .subscribe(users => console.log(users));
     }
    }
    
    

    上面示例中,我們通過依賴注入方式注入 http 服務,然后在 ngOnInit() 方法中調用 http 對象的 get() 方法來獲取數據。這個例子很簡單,它只處理一個請求,接下來我們來看一下如何處理兩個請求。

    Map 和 Subscribe

    有些時候,當我們發送下一個請求時,需要依賴于上一個請求的數據。即我們在需要在上一個請求的回調函數中獲取相應數據,然后在發起另一個 HTTP 請求。

    import { Component, OnInit } from '@angular/core';
    import { Http } from '@angular/http';
    import 'rxjs/add/operator/map';
    
    @Component({
     selector: 'app-root',
     template: `
     <p>{{username}} Detail Info</p>
     {{user | json}}
     `
    })
    export class AppComponent implements OnInit {
     constructor(private http: Http) { }
    
     apiUrl = 'https://jsonplaceholder.typicode.com/users';
     username: string = '';
     user: any;
    
     ngOnInit() {
     this.http.get(this.apiUrl)
     .map(res => res.json())
     .subscribe(users => {
     let username = users[6].username;
     this.http.get(`${this.apiUrl}?username=${username}`)
     .map(res => res.json())
     .subscribe(
     user => {
     this.username = username;
     this.user = user;
     });
     });
     }
    }
    
    

    在上面示例中,我們先從 https://jsonplaceholder.typicode.com/users 地址獲取所有用戶的信息,然后再根據指定用戶的 username 進一步獲取用戶的詳細信息。雖然功能實現了,但有沒有更好的解決方案呢?答案是有的,可以通過 RxJS 庫中提供的 mergeMap 操作符來優化上述的流程。

    mergeMap

    import { Component, OnInit } from '@angular/core';
    import { Http } from '@angular/http';
    import 'rxjs/add/operator/map';
    import 'rxjs/add/operator/mergeMap';
    
    @Component({
     selector: 'app-root',
     template: `
     <p>{{username}} Detail Info</p>
     {{user | json}}
     `
    })
    export class AppComponent implements OnInit {
     constructor(private http: Http) { }
    
     apiUrl = 'https://jsonplaceholder.typicode.com/users';
    
     username: string = '';
    
     user: any;
    
     ngOnInit() {
     this.http.get(this.apiUrl)
     .map(res => res.json())
     .mergeMap(users => {
     this.username = users[6].username;
     return this.http.get(`${this.apiUrl}?username=${this.username}`)
     .map(res => res.json())
     })
     .subscribe(user => this.user = user);
     }
    }
    
    

    在上面示例中,我們通過 mergeMap 操作符,解決了嵌套訂閱的問題。最后我們來看一下如何處理多個并行的 Http 請求。

    forkJoin

    接下來的示例,我們將使用 forkJoin 操作符。如果你熟悉 Promises 的話,該操作符與 Promise.all() 實現的功能類似。forkJoin 操作符接收一個 Observable 對象列表,然后并行地執行它們。一旦列表的 Observable 對象都發出值后,forkJoin 操作符返回的 Observable 對象會發出新的值,即包含所有 Observable 對象輸出值的列表。具體示例如下:

    import { Component, OnInit } from '@angular/core';
    import { Http } from '@angular/http';
    
    import { Observable } from 'rxjs/Observable';
    import 'rxjs/add/operator/map';
    import 'rxjs/add/observable/forkJoin';
    
    @Component({
     selector: 'app-root',
     template: `
     <p>Post Detail Info</p>
     <ul>
     <li>{{post1 | json}}</li>
     <li>{{post2 | json}}</li>
     </ul>
     `
    })
    export class AppComponent implements OnInit {
     constructor(private http: Http) { }
    
     apiUrl = 'https://jsonplaceholder.typicode.com/posts';
    
     post1: any;
    
     post2: any;
    
     ngOnInit() {
     let post1 = this.http.get(`${this.apiUrl}/1`);
     let post2 = this.http.get(`${this.apiUrl}/2`);
    
     Observable.forkJoin([post1, post2])
     .subscribe(results => {
     this.post1 = results[0];
     this.post2 = results[1];
     });
     }
    }
    
    

    我有話說

    除了 mergeMap 外,RxJS 中的 switchMap 有什么用?

    switchMap 操作符用于對源 Observable 對象發出的值,做映射處理。若有新的 Observable 對象出現,會在新的 Observable 對象發出新值后,退訂前一個未處理完的 Observable 對象。

    使用示例:

    var source = Rx.Observable.fromEvent(document.body, 'click');
    var example = source.switchMap(e => Rx.Observable.interval(100).take(3));
    
    example.subscribe({
     next: (value) => { console.log(value); },
     error: (err) => { console.log('Error: ' + err); },
     complete: () => { console.log('complete'); }
    });
    
    

    示例 marble 圖:

    source : -----------c--c-----------------...
     concatMap(c => Rx.Observable.interval(100).take(3))
    example: -------------0--0-1-2-----------...

    以上代碼運行后,控制臺的輸出結果:

    0
    0
    1
    2

    而在實際使用 Http 服務的場景中,比如實現 AutoComplete 功能,我們可以利用 switchMap 操作符,來取消無用的 Http 請求。

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    angular.js4使用 RxJS 處理多個 Http 請求

    angular.js4使用 RxJS 處理多個 Http 請求:有時候進入某個頁面時,我們需要從多個 API 地址獲取數據然后進行顯示。管理多個異步數據請求會比較困難,但我們可以借助 Angular Http 服務和 RxJS 庫提供的功能來實現上述的功能。處理多個請求有多種方式,使用串行或并行的方式。 基礎知識 merge
    推薦度:
    標簽: 使用 請求 http
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 精品蜜臀久久久久99网站| 91精品国产91久久久久久| 国产亚洲一区二区精品| 欧美精品黑人粗大欧| 日韩一级精品视频在线观看| 国产精品涩涩涩视频网站| 日韩专区亚洲精品欧美专区| 国产精品免费一区二区三区| 久久国产精品久久| 国产区精品一区二区不卡中文| 亚洲欧美日韩精品久久亚洲区 | 伊在人亚洲香蕉精品区麻豆| 国产高清精品在线| 久久青草国产精品一区| 97精品一区二区视频在线观看| 欧美精品VIDEOSSEX少妇| 亚洲日韩精品无码专区网址| 免费精品精品国产欧美在线欧美高清免费一级在线 | 精品久久久久久久无码| 亚洲av日韩av天堂影片精品| 亚洲av午夜精品一区二区三区 | 国产99精品久久| 国产AV国片精品一区二区| 精品视频一区二区三区免费| …久久精品99久久香蕉国产| 国产精品高清一区二区三区| 人人妻人人澡人人爽人人精品电影| 在线涩涩免费观看国产精品| 永久免费精品影视网站| 中文字幕亚洲精品无码| 亚洲精品无码成人片在线观看| 日韩精品无码永久免费网站| 男女男精品视频网站在线观看| 精品国产亚洲男女在线线电影 | 蜜臀久久99精品久久久久久| 久久精品国产精品亚洲人人| 青青草97国产精品免费观看| 久久国产热这里只有精品 | 国产一在线精品一区在线观看| 国产一区二区三区精品视频| 欧美午夜精品一区二区三区91 |