国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答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
    主站蜘蛛池模板: 欧美va在线 | 国产午夜视频 | 激情一区二区三区 | 精品国产欧美一区二区三区成人 | 91视频一区二区三区 | 在线免费观看国产 | 午夜视频免费在线观看 | 在线免费观看一区二区三区 | 欧美日韩在线国产 | 亚洲欧美另类视频 | 欧美极品尤物在线播放一级 | 亚洲爱爱网站 | 国产免费一区二区三区免费视频 | 亚洲精品在线免费观看 | 欧美亚洲网站 | 快播电影网日韩新片 | 午夜视频免费观看 | 欧美日韩国产高清一区二区三区 | 欧美日韩亚洲视频 | 欧美在线观看网站 | 国产a级一级久久毛片 | 亚洲精品国产成人99久久 | 久久久国产精品视频 | 国产精品一区二区四区 | 日韩在线欧美 | 91久久精品国产免费一区 | 国产成人一区二区三区在线播放 | 精品国产免费人成在线观看 | 在线播放国产一区二区三区 | 国产欧美精品 | 亚洲精品美女久久777777 | 全黄毛片 | 国产a级网站 | 欧美国产日韩一区二区三区 | 91久久国产综合精品 | 精品一区二区在线 | 欧美另类亚洲 | 国产激情一级毛片久久久 | 国产欧美日韩综合精品二区 | 亚洲国产成人精品91久久久 | 香蕉乱码成人久久天堂爱免费 |