【问题标题】:Rxjs: The scan operatorRxjs:扫描操作符
【发布时间】:2016-11-06 09:26:51
【问题描述】:

如果我将扫描替换为地图,我一直在阅读此代码,我无法获得未定义的属性“getTime”,为什么会发生这种情况? /p>

this.clock = Observable.merge(
        this.click$,
        Observable.interval(5000)
    )
        .startWith(new Date())
        .map((acc : Date)=> {
            const date = new Date(acc.getTime());
             date.setSeconds(date.getSeconds() + 1);
            return date;
        });

【问题讨论】:

标签: angular rxjs angular2-template angular2-directives rxjs5


【解决方案1】:

因为您将两个流合并为一个。您将收到来自click$interval 的事件。在这些情况下,它们不是 Date 类型,因此您可以使用 getTime 方法。

scan 运算符允许在事件之间保持状态。 map 只是将输入转换为输出。在最后一个的情况下,您将收到事件本身...

【讨论】:

  • 扫描算子在事件之间保持状态是什么意思
  • 我假设 .startWith(new Date()) 发出一个日期对象,地图会接收它,所以 getTime 应该在 acc 上读取
  • 是的,但它只适用于第一个事件......所以它会初始化扫描回调首先收到的值。
  • 我假设代码将从 startwith 运算符开始执行,这将发出一个日期对象,该对象将转到 map 函数(实际上,为了便于理解,我替换了 scan 运算符而不是 map),因为它Date 类型,应该是 getTime() (但是有错误 can not read property)
  • 以及合并现有主题 observable 和间隔的合并运算符(我假设间隔仅用于将其延迟到 5 秒),这将在第二次迭代时由 map 函数接收