手动刷新时rxjs轮询计时器和重置计时器上的数据

手动刷新时rxjs轮询计时器和重置计时器上的数据,rxjs,Rxjs,我在相关应用程序中使用以下库:Angular 4.x、ngrx 4.x、rxjs 5.4.x 我有一个api,我需要每5分钟轮询一次。用户还可以手动刷新数据。该数据存储在ngrx存储中。我使用的是ngrx效果,因此通过发送“FETCH”类型的操作来检索数据 我想设置一个rxjs流,它将把“FETCH”操作发送到ngrx存储。这将是一个滑动的5分钟计时器,当用户手动更新商店时重置。当订阅时,流最初应该发出一个值 我不知道如何重置计时器。在纯javascript中,我将执行以下操作: consol

我在相关应用程序中使用以下库:Angular 4.x、ngrx 4.x、rxjs 5.4.x

我有一个api,我需要每5分钟轮询一次。用户还可以手动刷新数据。该数据存储在ngrx存储中。我使用的是ngrx效果,因此通过发送“FETCH”类型的操作来检索数据

我想设置一个rxjs流,它将把“FETCH”操作发送到ngrx存储。这将是一个滑动的5分钟计时器,当用户手动更新商店时重置。当订阅时,流最初应该发出一个值

我不知道如何重置计时器。在纯javascript中,我将执行以下操作:

console.clear();
让定时器;
设计数器=0;
函数fetch(){
log('fetch',counter++);
poll();
}
函数poll(){
如果(计时器!=null){
清除超时(计时器);
}
计时器=窗口。设置超时(()=>{
console.log('poll');
fetch();
}, 5000);
}
函数manualGet(){
控制台日志(“手动”);
fetch();
}
fetch()

获取数据
在用vanilla JS写出来之后,我意识到计时器的来源应该是数据。我正在努力弄清楚来源是什么。很明显,它不可能是计时器,因为我需要重置它

我愿意接受更好的选择,但以下是我解决问题的方法:

console.clear();
设计数器=0;
常量数据=新的接收行为主体(空);
函数fetch(){
data.next(计数器++);
}
函数manualGet(){
控制台日志(“手动”);
fetch();
}
//设置投票
数据.开关图(()=>Rx.可观察计时器(5000))
.subscribe(()=>{
console.log('poll');
fetch();
});
//订阅数据
data.filter(x=>x!=null)。
订阅(x=>{console.log('data',x);});
//先取
fetch()


获取数据
您希望流中包含两个组件–一个计时器和一些用户输入。让我们从用户输入开始。我假设可以单击一些按钮:

const userInput$ = Observable.fromEvent(button, 'click');
现在我们想启动一个计时器,它会在每次
userInput$
发出时重置。我们可以使用

userInput$.switchMap(() => Observable.timer(0, 5000));
但是,我们也希望此流在用户不必首先单击按钮的情况下启动。但这也不是问题:

userInput$.startWith(null);
现在我们把所有这些放在一起:

Observable.fromEvent(button, 'click')
    .startWith(null)
    .switchMap(() => Observable.timer(0, 5000))
    .subscribe(() => dispatchFetch());
请注意,我下面是您使用5秒计时器的示例,而不是您在问题中提到的5分钟计时器