我的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();
}
我尝试了不同的选项,但没有一个我可以使它工作。任何帮助如何实现这一目标?
答案 0 :(得分:2)
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的组合中发出一个项目。