2016-05-24 57 views
1

Observable,如果下一個是平等的,如何忽略最後一個?Observable,如果下一個是平等的,如何忽略最後一個?

@Injectable() 
export class LoadingService { 
    private _observer: Observer<boolean>; 
    loading: Observable<boolean>; 
    constructor() { 
     this.loading = new Observable<boolean>(
      observer => this._observer = observer); 
    } 

    toggleLoadingIndicator(isLoading: boolean) { 
     if (this._observer) { 
      this._observer.next(isLoading); 
     } 
    } 
} 

和訂閱:

loadingService.loading 
    .subscribe(isLoading => this.changeLoading(isLoading) 
); 

所以,當我打電話,這樣在異步:

loadingService.toggleLoadingIndicator(true); 
setTimeout(() => { 
    loadingService.toggleLoadingIndicator(false); 
    console.log('finish 5000'); 
}, 5000); 

loadingService.toggleLoadingIndicator(true); 
setTimeout(() => { 
    loadingService.toggleLoadingIndicator(false); //here turn the indicator false, but it should be true once there is a other call async waiting (the 5000) 
    console.log('finish 3000'); 
}, 3000); 

在3000結束,指示燈變爲假。我如何檢測是否調用了第二個true來取消下一個錯誤並等待最後一個錯誤?

+3

您正在尋找不同的:https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/distinctuntilchanged.md –

回答

1

首先,我會考慮使用Subject(來自RxJS的一個化合物ObservableObserver)。

對象有一個屬性observers可能有助於您的要求,即您可以檢查主題/觀察者是否有其他觀察者。

另一個有趣的選擇是AsyncSubject,它只返回關閉前的最後一個值(或發生錯誤時發生錯誤)。 AsyncSubject也有方法hasObservers()

最後。如果您需要實現對不同異步操作何時完成的某種控制(例如並行http請求),您還可以考慮使用ObservableforkJoin()方法,在這種情況下我發現它非常方便(有幾個網頁關於Internet這種技術,如http://www.metaltoad.com/blog/angular-2-http-observables),直到改變

+0

我走看看Subject和AsyncSubject,但沒有'hasObservers()'方法。 我正在使用rxjs。 – iuristona

+0

你說得對。我想現在'Subject' /'AyncSubject'具有'observers'屬性。你可以使用'mySubject.observers.length'這樣的東西來看看有多少觀察者。我更新我的答案,並希望這有助於。 – Picci

相關問題