2017-08-25 69 views
0

所以基本上我有一個函數,每次從signalR接收到一個新的數據時,就會向服務器發送2個HTTP請求,這個數據會被多次觸發。所以getitemCount函數將被調用很多次。因此它也會碰到服務器很多次。Angular Http - 如何取消過時的請求

getitemCount是承諾,因爲我用toPromise()運算符將其從Observable轉換。

我想要做的是:當從服務器收到更新時,如果有任何getitemCount正在進行。它將被取消,併發出新的請求。

export class LeftNavigationComponent implements OnInit, OnDestroy { 
    typeACount: number = 0; 
    typeBCount: number = 0;  

    constructor(
     private itemService: service.ItemService,   
     private signalR: service.SignalRService) { } 

    ngOnInit(): void { 
     this.subscriptions = [    
      this.signalR.itemCreated.subscribe(item => this.onUpdatingData()), 
      this.signalR.itemUpdated.subscribe(item => this.onUpdatingData()), 
      this.signalR.itemDeleted.subscribe(itemId => this.onUpdatingData())] 
    } 

    onUpdatingData() { 
     Promise.all([ 
      this.itemService.getitemCount(APP_SETTING.TYPE_A), 
      this.itemService.getitemCount(APP_SETTING.TYPE_B)]) 
      .then(response => this.gettingCountDone(response)) 
    } 

    gettingCountDone(response) { 
     this.typeACount = <any>response[0]; 
     this.typeBCount = <any>response[1];   
    } 
} 

我已經使用switchMap爲前實現搜索,但仍然無法將其存檔的當前使用情況。

任何人都可以給我一個建議。到目前爲止,我所做的是使用Observable而不是Promise,並使用folkJoin來結合結果。但它的行爲與我目前的行爲相同。

onUpdatingData() { 
    Rx.Observable.forkJoin(this.itemService.getitemCount(APP_SETTING.TYPE_A), this.itemService.getitemCount(APP_SETTING.TYPE_B), (r1, r2) => { 

    }) 
} 
+0

我想退訂應該做的 –

+0

請問它看起來像我分配可觀察到的訂閱變量,然後每次我去onUpdatingData,我檢查如果變量不爲空,並取消訂閱? – trungk18

+1

準確地說,您需要保留所有訂閱。但我再次不確定,因爲我從來沒有這樣做過,只是邏輯上它應該工作 –

回答

2

我只是嘗試localy是的退訂做的工作

const subscription = this.http.get(`/api/v2/url`).subscribe(); 
subscription.unsubscribe(); 

,我看到的是請求在Chrome取消