2

我正在阅读 Rxjs 6 的弹珠测试文档,并在“大理石语法”的“示例”部分下找到了这部分

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

这是我的问题的示例:

'--(abc)-|':在第 2 帧发出 a、b 和 c,然后在第 8 帧完成

为什么说第 8 帧是完整的?

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

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

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

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

4

1 回答 1

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

于 2019-09-18T19:13:02.517 回答