用RxJS实现复杂超时

用RxJS实现复杂超时,rxjs,Rxjs,我正在发出一个HTTP请求,我想使用timeout来提醒用户 最终目标是给用户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 =>

我正在发出一个HTTP请求,我想使用timeout来提醒用户

最终目标是给用户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"));
当然,这段代码无法执行,所以我的问题是如何执行:)


谢谢

超时操作符用于在经过一定时间后抛出错误,从而杀死可观察对象。如果我对你的问题理解正确的话,这不是你想要的结果

如果你真的只想通知用户两次——在5秒和10秒之后,我会使用一个可观察的间隔,间隔为5秒,它将与http请求同时启动。当请求完成时,或者当触发2次发射时(因为您只需要2次通知),此可观察项将终止

将打印:

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

你是希望请求在10秒后失败,还是仅仅为了得到通知?回答得很好!但是有一个问题-TakeTill是否会向SendHTTPRequest添加第二个订户,从而导致http调用发出两次?查看源代码TakeTill似乎确实订阅了通知程序。。。如果httpRequest$是一个冷可观察的对象,那么我相信将需要.share()。实际上,您是对的@Miller,TakeTill似乎确实订阅了通知程序
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