使用RxJS实现复杂超时

时间:2018-02-17 18:34:47

标签: rxjs

我正在发出HTTP请求,我想使用超时来提醒用户。

最终目标是为用户提供2条消息 - 一条在5秒延迟之后,另一条在5秒之后(自发送HTTP请求以来10秒)。

理想情况下它看起来应该是这样的:

Observable.fromPromise(SendHTTPRequest)
.timout(5000).subscribe(null,timeout => console.log("It's been 5 seconds"));
.timout(5000).subscribe(null,timeout => console.log("It's been 10 seconds"));

当然这个代码无法完成,所以我的问题是如何完成:)

谢谢!

2 个答案:

答案 0 :(得分:1)

超时运算符用于在经过一定时间后抛出错误,从而终止Observable。如果我理解你的问题,这不是你理想的结果。

如果你想要的只是通知用户两次 - 在5秒和10秒之后,我将使用间隔为5秒的间隔Observable,它将与http请求同时开始。此Observable将在请求完成时或在触发2次排放时终止(因为您只需要2次通知)。

const httpRequest$ = Observable.fromPromise(SendHTTPRequest)
    .share();

const interval$ = Observable.interval(5000)
    .takeUntil(httpRequest$)
    .take(2)
    .map(x => (x + 1) * 5)
    .subscribe(seconds => console.log("It's been " + seconds + " seconds"));

httpRequest$.subscribe(response => doSomethingWithResponse(response));

答案 1 :(得分:0)

import { of,interval } from 'rxjs';
import { groupBy, mergeMap, toArray, map,merge, reduce, concatMap, delay, concat, timeout, catchError, take } from 'rxjs/operators';


const obs$ = of('coucou');
const obs2$ = interval(5000).pipe(take(1), map(() => of('hello')));
const obs3$ = interval(5000).pipe(take(1), map(() => of('world'))); 

const result$ = obs$.pipe(concat(obs2$.pipe(concat(obs3$)))); 
const subscribe = result$.subscribe(val => console.log(val + ' ' + new Date().toLocaleTimeString()));  

将打印:

coucou 20:10:15
[object Object] 20:10:20
[object Object] 20:10:25