rxjs 5.2:ReplaySubject等待3秒,如果只为空则抛出超时

时间:2018-02-08 01:37:39

标签: angular rxjs5

我的Angular服务中有setter和getter,如下所示,我想要的是如果vizItemStream$不在3秒内,我想抛出超时错误。如果已设置或已设置项目,那么它不应该抛出(如果非空)。

vizItemStream$ = new ReplaySubject<any>(1);

set visualizeItem(item: VizItem) {
    this.vizItemStream$.next(item);
}

get visualizeItem$(): Observable<VizItem> {
    //Only throw timeout if there are no items emitted in 3 seconds
    // this.vizItemStream$.timeout(3000);
    let sub = Observable.empty().delay(3000).subscribe(e => {
        this.vizItemStream$.isEmpty().subscribe(e => {
            this.vizItemStream$.error(new Error('Timeout'));    
        });
        sub.unsubscribe();
    });        
    return this.vizItemStream$.asObservable();
}

我尝试了不同的选项,但没有一个我可以使它工作。任何帮助如何实现这一目标?

1 个答案:

答案 0 :(得分:2)

您可以使用race运算符和timer来获取您要查找的行为:

import 'rxjs/add/observable/throw';
import 'rxjs/add/observable/timer';
import 'rxjs/add/operator/concatMap';
import 'rxjs/add/operator/race';

get visualizeItem$(): Observable<VizItem> {
  return this.vizItemStream$
    .race(Observable
      .timer(3000)
      .concatMap(() => Observable.throw(new Error('Timeout'))))
    .asObservable();
}

race运算符:

  

返回一个Observable,它反映第一个源Observable,从此Observable和提供的Observable的组合中发出一个项目。