2015-08-24 65 views
2

我在我的angular應用程序中使用rxjs。當多個REST調用進行時,我並不總是按照我想要的順序返回數據。爲什麼rxjs不取消我的承諾?

控制器:

constructor() { 
    rx.Observable.fromPromise(this.getExpenses(toDate, fromDate))).subscribe(res => { 
      that.setExpenses(res); 
    }); 
} 

getExpenses(toDate, fromDate) { 
    return this.expenseService.getExpenses(fromDate, toDate); 
} 

updateDate() { 
    rx.Observable.fromPromise(this.getExpenses(toDate, fromDate))).subscribe(res => { 
      that.setExpenses(res); 
    });  
} 

服務:

getExpenses: function(fromDate, toDateloadExtendedData) { 
    return Restangular.all('expenses').getList({fromDate: fromDate, toDate: toDate}); 
}, 

在我constructor,我想獲得本年度的結果,但有時用戶將更新調用之前的日期constructor返回。然後我有一個競爭條件,因爲用戶想要updateDate信息,而不是constructor信息。我如何找回最近請求的數據?

+0

你能提供更多的背景嗎?您所展示的只是一個單一的承諾解決方案,您如何使用此代碼?多重承諾在哪裏產生? – paulpdaniels

回答

2

由於您沒有做任何事情來「鏈接」這兩個序列,RxJs怎麼知道它們是相關的?

您需要創建一個單一的數據流,那麼你可以使用switch只能觀察最近的請求:

constructor() { 
    this._requests = new Rx.Subject(); 

    // listen to requests 
    this._requests.switch().subscribe(res => this.setExpenses(res)); 

    // start the first request 
    this._requests.onNext(this.getExpenses(toDate, fromDate)); 
} 

updateDate() { 
    // start a new request 
    this._requests.onNext(this.getExpenses(toDate, fromDate)); 
} 

注意,這實際上不會取消以前的請求。它會忽略它們產生的任何結果。如果你真的想取消他們,你的開支服務將需要提供一個API取消正在進行的請求。

+0

我發佈了一個類似的問題[here](http://stackoverflow.com/questions/43151520/how-to-ignore-all-from-an-observable-if-the-other-observable-has-data-in- rxjs)。希望你能透露一些見解。 –