[英]RxJS (Interval) Observable wait for last observable to complete
我想要一个可观察的间隔,它等待最后一次执行。 这是我的尝试。
简单的事情,不等待。
interval(1000)
.subscribe(async x => {
await new Promise(resolve => setTimeout(resolve, Math.floor(Math.random() * 10000) + 1000));
console.log('Got counter', x);
});
结果:4, 1, 2, 6, 9, 7, 6, 3, ...
下一次尝试,但有点糟糕。
let alreadyRunning = false;
interval(1000)
.pipe(skipWhile(() => alreadyRunning))
.subscribe(async x => {
alreadyRunning = true;
await new Promise(resolve => setTimeout(resolve, Math.floor(Math.random() * 10000) + 1000));
console.log('Got counter', x, alreadyRunning);
alreadyRunning = false;
});
skipWhile 仅在第一件事为真之前等待。
现在我尝试了 switchMap 也不起作用。
interval(1000)
.pipe(switchMap(() => from(new Promise(resolve => setTimeout(resolve, Math.floor(Math.random() * 10000) + 1000)))))
.subscribe(async x => {
console.log('Got counter', x);
});
也不工作:
interval(1000)
.pipe(switchMap(x => from(async () => {
await new Promise(resolve => setTimeout(resolve, Math.floor(Math.random() * 10000) + 1000));
console.log('Got counter', x);
return x;
})))
.subscribe(async x => {
console.log('X', x);
});
有没有解决方案来实现这一点? 等待最后一个 observable 完成? 订阅后没有机会这样做。 那么我以前怎么能做到这一点。
//编辑1:我想要什么?
我有一个执行 HTTP 请求的间隔。 因此,当 HTTP 请求等待几秒钟时,将执行下一个间隔,以便多次执行请求。
我想避免的。
MergeMap 也不起作用。
interval(1000)
.pipe(mergeMap(x => from(new Promise(resolve => setTimeout(() => resolve(x), Math.floor(Math.random() * 10000) + 1000)))))
.subscribe(async x => {
console.log('Got counter', x);
});
我不确定你在问什么,但如果用户 AJT82 是正确的(即,你想在上一个请求尚未完成时从间隔中删除任何排放)
以下是我将如何实现它:
interval(1000).pipe(
tap(_ => console.log('interval hits every second!')),
exhaustMap(_ => {
console.log("request has started!")
return timer(3000).pipe( // simulation that takes 3 seconds to complete
tap(_ => console.log("request has finished!"))
)
})
).subscribe({
next: v => console.log("Value emitted: ", v),
error: e => console.log("Error emitted: ", e),
complete: () => console.log("Complete emitted")
});
Observables 是 Promise 的严格超集。 这意味着如果你可以用 promise 做某事,你也可以用 observable 做这件事。
不过,与 Promises 不同的是,Observables 没有像 async/await 这样的特殊语法糖。
Observables 与 Promises 的互操作性相当好。 大多数操作员通过在后台为您转换 Promise 来处理 Promise 和 observables。
如果您的项目正在使用一个并且您想包含一个使用另一个的库,这将很有帮助。
另一方面,如果你的代码已经在使用 observables 机制,那么就永远没有理由使用 Promise。 除非您真的有很好的理由,否则应该避免这种代码气味。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.