在takeWhile操作符返回“ false”后,RXJS计时器继续运行

时间:2019-03-20 13:23:49

标签: rxjs

我正在尝试设置一个简单的队列,然后使用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)的命令继续执行的原因有任何想法

1 个答案:

答案 0 :(得分:1)

Arghh ..要在发布问题5分钟后解决问题。

问题是我导入了错误的计时器,该计时器的错误程度不足以引起代码执行的明显问题(也许是下一个人的一堂课)。

由于我的IDE,我导入了该问题

import { timer } from "rxjs/internal/observable/timer";

但正确的导入是

import { timer } from 'rxjs';

现在神奇的是我的代码可以按预期工作