我正在发出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"));
当然这个代码无法完成,所以我的问题是如何完成:)
谢谢!
答案 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