我正在尝试设置一个简单的队列,然后使用rxjs Observables进行轮询,直到完成完整的样式机制为止,并且一直在努力找出我在做什么错。
我有以下代码
siteService.queue("123") //(1) Queues a processing task
.pipe(
switchMap((res) => {
console.log("Polling for changes...");
return timer(100, 2000) //(2)
.pipe(
flatMap(() => {
console.log("Fetching Site...");
return siteService.get("123); //(3)
}),
takeWhile((res: SiteResponse) => {
let r = res.site.site_generation_status !== 'Current';
console.log("Take While", r); //(4)
return r;
})
);
})
)
.subscribe((res) => {
console.log("Result", res);
}, (err) => {
console.error("Error", err);
}, () => {
console.log("Done")
});
此代码应将一些处理请求(1)排队,然后将站点对象的 site_generation_status 设置为“已排队”,并由某些后端进程来实现,该后端进程最终会将状态更新为“当前” '。这个想法是,计时器(2)应该首先在100毫秒后获取结果,然后每2000毫秒运行一次,直到generation_status为当前状态。
该代码通常有效,但是,在takeWhile(4)评估为false后,继续执行(3)的调用
这是一些控制台输出
Polling for changes...
Fetching Site...
Take While true
Result {site: {…}}
Fetching Site...
Take While true
Result {site: {…}}
Fetching Site...
Take While true
Result {site: {…}}
Fetching Site...
Take While false
Done
Fetching Site...
Fetching Site...
Fetching Site...
Fetching Site...
在takeWhile评估为true且订阅结束后(在日志输出中由“完成”指示),是否有人对导致(3)的命令继续执行的原因有任何想法
答案 0 :(得分:1)
Arghh ..要在发布问题5分钟后解决问题。
问题是我导入了错误的计时器,该计时器的错误程度不足以引起代码执行的明显问题(也许是下一个人的一堂课)。
由于我的IDE,我导入了该问题
import { timer } from "rxjs/internal/observable/timer";
但正确的导入是
import { timer } from 'rxjs';
现在神奇的是我的代码可以按预期工作