为什么 rxjs 6 弹珠文档说“--(abc)-|”在第 8 帧完成?

Why does rxjs 6 marbles documentation say "--(abc)-|" completes on frame 8?

我正在阅读 Rxjs 6 的弹珠测试文档,并在 "Marble Syntax"

的 "Examples" 部分下找到了这一部分

https://github.com/ReactiveX/rxjs/blob/master/docs_app/content/guide/testing/marble-testing.md#examples

这是我的问题的示例:

'--(abc)-|': on frame 2 emit a, b, and c, then on frame 8 complete

为什么说第 8 帧完成?

对于上面的字符串,我总共只计算了 5 帧。字符串 (abc) 应该只算作一个帧。然后是另一帧 - 然后是完整的 |.

--(abc)-|
11  1  11 = sum(5)

所以我不明白为什么它是第 8 帧,但是当我 运行 在使用弹珠的单元测试中上面的内容时,它输出它在第 8 帧完成。

那么这 3 个额外的帧是从哪里来的?

这是有意为之的,因为当事件在括号外时,它仅从其字符串位置计算帧。我相信主要原因是您仍然可以将多个弹珠图放在彼此下面并且它仍然易于阅读:

combineLatest([
  hot('-a--b-----c-d-e-|'),
  hot('--------f--g-h-i--j-|'),
  hot('--1--(234)---5-6---|'),
]);

您仍然可以轻松判断 5 何时发出。如果它按预期工作,那么您必须手动减去帧以判断 5 是否在 dg 之前。

从源代码中看不是很明显,但它会为图表中的每个字符(advanceFrameBy(1) 调用)推进帧:

https://github.com/ReactiveX/rxjs/blob/master/src/internal/testing/TestScheduler.ts#L334