首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >switchMap奇异行为

switchMap奇异行为
EN

Stack Overflow用户
提问于 2019-01-29 09:07:30
回答 2查看 142关注 0票数 0

我试图理解以下代码的控制台输出。我原以为它会每500毫秒就能从0到9记录日志,然后再用0重新开始(最后以9结束)。

但事实是,它只会在第一次控制日志0-9,然后输出变成0- 8,在8上暂停1秒,然后再从0开始。

我的问题是

  1. 为什么9只出现过一次?
  2. 为什么在8秒上暂停1秒(而不是500毫秒)?

由于源可观测发射每5秒发出一次,内部可观测发射每500 on发出一次,因此应该有足够的时间使内部可观测到的发射量达到0至9,而不应停留在8。

下面是stackblitz上的相同代码:https://stackblitz.com/edit/typescript-eb62ap?file=index.ts&devtoolsheight=100

代码语言:javascript
复制
// RxJS v6+
import { timer, interval } from 'rxjs';
import { switchMap } from 'rxjs/operators';

//emit immediately, then every 5s
const source = timer(0, 5000);
//switch to new inner observable when source emits, emit items that are emitted
const example = source.pipe(switchMap(() => interval(500)));
//output: 0,1,2,3,4,5,6,7,8,9...0,1,2,3,4,5,6,7,8
const subscribe = example.subscribe(val => console.log(val));
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-29 09:27:58

为什么9只出现一次?

在我的例子中,根本没有显示9。所以我想这可能是某种时间的不准确?这是很紧的--理论上说,interval的启动时间比计时器晚一点。因此,它只打印9个值(0-8)。

为什么在8秒上暂停1秒(而不是500毫秒)?

8印在4500毫秒。当计时器达到5000毫秒(从8开始需要500毫秒)时,它就会提升新的interval。新的间隔将在另一个500毫秒后发射。因此,两者之间存在1s延迟。

如果有9个印刷,我预计延迟只有500毫秒。但是,在我的例子中,9从来没有打印过。

票数 1
EN

Stack Overflow用户

发布于 2019-01-29 09:27:49

因为计时器不够精确,这就是NodeJS事件循环和timer的问题。

打印9的最后一个间隔即将执行,但timer(0, 5000)已经到了它的时间。

您可以尝试增加一点timer,让9打印出来。

代码语言:javascript
复制
const source = timer(0, 5100); //add some time
const example = source.pipe(switchMap(() => interval(0,500)));

或者使用timer而不是interval,以便毫不拖延地执行以查看打印9

代码语言:javascript
复制
const source = timer(0, 5000);
const example = source.pipe(switchMap(() => timer(0,500))); //use timer
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54417306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档