2016-10-14 76 views
3

所以我想爲我的Angular 2應用實現一個自定義的XHRBackend。這是我的課:在rxjs Observer上訂閱多次而不執行多個請求

import {Request, XHRBackend, BrowserXhr, ResponseOptions, XSRFStrategy} from "@angular/http"; 
import "rxjs/add/operator/catch"; 
import "rxjs/add/observable/throw"; 
import {SlimLoadingBarService} from "ng2-slim-loading-bar"; 

export class LoadingBarXHRBackend extends XHRBackend { 
    constructor(_browserXhr: BrowserXhr, _baseResponseOptions: ResponseOptions, _xsrfStrategy: XSRFStrategy, private slimLoadingBarService: SlimLoadingBarService) { 
     super(_browserXhr, _baseResponseOptions, _xsrfStrategy); 
    } 

    createConnection(request: Request) { 
     this.slimLoadingBarService.start(); 

     let xhrConnection = super.createConnection(request); 

     xhrConnection.response.share().subscribe(() => { 
      this.slimLoadingBarService.complete(); 
     }); 

     return xhrConnection; 
    } 

} 

正如你可以看到我嘗試使用.share()方法中所描述的here,但它不工作,我希望它的方式。

我想「掛鉤」到XHR請求的創建和完成以顯示加載欄。但是如果我離開那個.share(),我會爲每個.subscribe()調用獲得一個單獨的HTTP請求。 ?

但是,如果使用.share()我的第二次認購事項將不會在所有:(

什麼我做錯了感謝執行

+0

也許http://stackoverflow.com/questions/36271899/what-is-the-correct-way-to-share-the-result-of-an-angular-2-http-network-call-in –

回答

2

試試這個:

createConnection(request: Request) { 
    this.slimLoadingBarService.start(); 

    let xhrConnection = super.createConnection(request).response.share(); 

    xhrConnection.subscribe(() => { 
     this.slimLoadingBarService.complete(); 
    }); 

    return xhrConnection; 
} 

在訂閱和返回之前,您需要share(),以便內部和外部的人都可以獲得觀察者的多播版本。

但是請注意,牛逼的份額變成了一個熱點觀察到的obseravble,所以你可能想這樣做,而不是:

createConnection(request: Request) { 
    return Observable.defer(() => { 
     this.slimLoadingBarService.start(); 

     return super.createConnection(request).response 
      .do(() => this.slimLoadingBarService.complete()); 
    }); 
} 

Observable.defer意味着,直到你實際上訂閱它沒有它內部的代碼就會被執行。 do操作員輕觸入事件流而不影響流。