2016-10-14 75 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操作员轻触入事件流而不影响流。