Observables,如果下一个是等于,如何忽略最后一个?

时间:2016-05-24 19:28:14

标签: typescript angular rxjs observable

Observables,如果下一个是等于的话,如何忽略最后一个?

@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结束时指示灯变为假。如何检测是否为了取消下一个错误并等待最后一个错误而调用了第二个真值?

1 个答案:

答案 0 :(得分:1)

首先,我会考虑使用Subject(来自RxJS的一个类ObservableObserver

主题具有可能对您的要求有帮助的属性observers,即您可以检查主题/可观察者是否有其他观察者。

另一个有趣的选项是AsyncSubject,它只返回关闭前的最后一个值(或错误发生时的错误)。此外,AsyncSubject的方法为hasObservers()

最后。如果您需要对何时完成不同的异步操作(例如并行http请求)实施某种控制,您还可以考虑使用forkJoin() Observable方法,在这种情况下我觉得非常方便(互联网上有几个关于这种技术的页面,例如http://www.metaltoad.com/blog/angular-2-http-observables