英文:
How can I improve this function using RXJS?
问题
我对RXJS还不熟悉,我想创建一个函数,该函数会递归地检查状态,直到状态变为"Available"。我找到了使用纯JS来表示我所寻找的内容:
setTimeout(() => {
this.updateStatus();
}, status === 'Pending' ? 0 : 2000);
英文:
I'm new with RXJS and I would like to do a function which checks recursively a status until it will be "Available". I found this with vanilla JS to represent what I'm looking for:
setTimeout(() => {
this.updateStatus();
},status === 'Pending' ? 0 : 2000);
答案1
得分: 1
你提到想要在状态可用之前一直进行检查。我假设你正在寻找一种轮询方式,但是你的代码片段中使用 setTimeout()
方法只会在延迟后运行一次,不会持续调用 updateStatus
方法。如果你想要使用纯JS计时器,你需要考虑使用 setInterval()
。
如果你想要使用rxjs每隔几秒钟进行检查,一种解决方案是使用 timer
。timer
将在初始延迟后,每隔 period
毫秒发出一个事件。点击此处查看文档
你可以按照以下方式进行操作:
timer(delay, interval)
.pipe(
tap(() => this.updateStatus()),
filter(() => this.status === 'Available'),
take(1)
).subscribe(() => {
console.log('Complete');
//在这里执行工作
});
这个示例使用 tap
操作符来每隔 interval
毫秒调用你的 updateStatus
方法,一旦你的 status
变量设置为 'Available',可观察对象将触发,subscribe
块中的代码将被执行。take(1)
确保只有一个发射通过,一旦状态不再是挂起的,你的可观察对象将被关闭,计时器将不再有任何活跃的订阅者。
如果你的意图是只检查一次,你也可以使用 timer
在延迟后运行一次,类似于你的 setTimeout()
示例:
timer(delay).subscribe(x => {
this.updateStatus();
//在这里做一些事情。
})
英文:
You've mentioned you want to keep checking the status until it's available. I'm assuming you're looking for some kind of polling, but your code snippet with the the setTimeout()
method will only run once after a delay and won't keep calling the updateStatus
method. If you wanted to do a vanilla JS timer you'd need to look at using setInterval()
If you want to check every few seconds using rxjs, one solution could be to use the timer
. The timer will emit an event every period
milliseconds, after an initial delay of delay
milliseconds. See here for docs
You could do something along these lines:
timer(delay, interval)
.pipe(
tap(() => this.updateStatus())
filter(() => this.status === 'Available'),
take(1)
).subscribe(() => {
console.log('Complete');
//do work here
});
This example uses the tap
operator to call your updateStatus
method every interval
milliseconds after the initial delay has passed. Once your status
var is set to 'Available'
, the observable will fire and the code in the subscribe
block will be executed. The take(1)
ensures that only one emission gets through once the status is no longer pending, so your observable will be closed and the timer will no longer have any active subscribers.
If your intent is to only check once, you can also use the timer
to run once after a delay, similar to your setTimeout()
example:
timer(delay).subscribe(x => {
this.updateStatus();
//do something here.
})
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论