我试图理解以下代码的控制台输出。我原以为它会每500毫秒就能从0到9记录日志,然后再用0重新开始(最后以9结束)。
但事实是,它只会在第一次控制日志0-9,然后输出变成0- 8,在8上暂停1秒,然后再从0开始。
我的问题是
由于源可观测发射每5秒发出一次,内部可观测发射每500 on发出一次,因此应该有足够的时间使内部可观测到的发射量达到0至9,而不应停留在8。
下面是stackblitz上的相同代码:https://stackblitz.com/edit/typescript-eb62ap?file=index.ts&devtoolsheight=100
// 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));发布于 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从来没有打印过。
发布于 2019-01-29 09:27:49
因为计时器不够精确,这就是NodeJS事件循环和timer的问题。
打印9的最后一个间隔即将执行,但timer(0, 5000)已经到了它的时间。
您可以尝试增加一点timer,让9打印出来。
const source = timer(0, 5100); //add some time
const example = source.pipe(switchMap(() => interval(0,500)));或者使用timer而不是interval,以便毫不拖延地执行以查看打印9。
const source = timer(0, 5000);
const example = source.pipe(switchMap(() => timer(0,500))); //use timerhttps://stackoverflow.com/questions/54417306
复制相似问题