在takeWhile操作符返回'false'后,RXJS Timer继续运行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在takeWhile操作符返回'false'后,RXJS Timer继续运行相关的知识,希望对你有一定的参考价值。

我正在尝试设置一个简单的队列,然后使用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设置为“Queued”,并由一些后端进程完成,最终将状态更新为“Current”。这个想法是定时器(2)应该在100ms之后最初获取结果,然后每2000ms运行一次,直到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并且订阅结束(由日志输出中的'Done'表示)之后,是否有任何人想知道可能导致(3)处的命令继续执行的原因

答案

Arghh ..想要在发布问题5分钟后搞清楚问题..

问题是我导入了错误的计时器,这个计时器没有发生严重错误,导致代码执行出现明显问题(也许是下一个人的教训)。

问题是我导入了我的IDE

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

但正确的导入是

import  timer  from 'rxjs';

并且神奇地现在我的代码按预期工作

以上是关于在takeWhile操作符返回'false'后,RXJS Timer继续运行的主要内容,如果未能解决你的问题,请参考以下文章

使用 takewhile (itertools) 考虑最后一次迭代

Takewhile lambda函数无法识别字符串

java 中的Takewhile方法 和Dropwhile方法

exist 存在 Python操作mysql pymysql sql注入问题 # 39

如何不错过 itertools.takewhile() 之后的下一个元素

RxJS takeWhile 但包含最后一个值