Rxjs:扫描操作符

Posted

技术标签:

【中文标题】Rxjs:扫描操作符【英文标题】:Rxjs: The scan operator 【发布时间】: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;
        );

【问题讨论】:

console.log(acc) 的输出是什么? 其显示未定义 请看以下调试问题的建议:***.com/help/mcve 第二个建议是不要假设什么,而是阅读您正在使用的函数的文档:github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/… for rxjs v4.请注意,对于 Rxjs v2,种子是第一位的 我正在尝试理解这段代码 【参考方案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 函数接收

以上是关于Rxjs:扫描操作符的主要内容,如果未能解决你的问题,请参考以下文章

RxJS之组合操作符 ( Angular环境 )

Rxjs之创建操作符(Angular环境)

RxJS之转化操作符 ( Angular环境 )

如何使用 Jest 测试 Rxjs 空操作符

RxJS之过滤操作符 ( Angular环境 )

rxjs中常用的操作符