rxjs 节流 this.durationSelector 不是函数

Posted

技术标签:

【中文标题】rxjs 节流 this.durationSelector 不是函数【英文标题】:rxjs throttle this.durationSelector is not a function 【发布时间】:2017-02-27 15:37:48 【问题描述】:

我正在尝试使用以下代码 throttlengrx 存储操作更新事件

import 'rxjs/add/operator/throttle'
import  Dispatcher, Store  from '@ngrx/store';
...
static get parameters() 
  return [[Dispatcher]];

constructor(actions$) 
...

this.actions$
  .filter(action => action.type === this.Actions[`LOAD_USERS_REQUEST`])
  .throttle(1000 /* ms */)
  .subscribe(() =>
    ...
  );

这会给我一个错误

在 ThrottleSubscriber.tryDurationSelector (throttle.js:80) 类型错误: this.durationSelector 不是函数

当我将 .throttle(1000) 替换为 .throttle(() => 1000) 时,它会抛出一个不同的错误,清楚地表明油门需要一个功能,而不是我提供的那个。但我想知道为什么因为文档状态油门需要一个数字值。

https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/throttle.md

【问题讨论】:

将此添加到您的导入中 import 'rxjs/add/operator/throttle' 我当然这样做了,否则它甚至在进入油门功能之前就崩溃了 试过throttleWithTimeout而不是throttle? 【参考方案1】:

您在 https://github.com/Reactive-Extensions/RxJS 上引用的文档页面与 RxJS 4 相关。由于您使用的是 Angular2,因此您使用的是 RxJS 5。

操作员throttle() 期望作为参数一个 Observable 或 Promise。

运算符throttleTime() 以毫秒为单位作为参数时间。

所以你应该使用throttleTime(1000)

请注意,使用.throttle(() => 1000) 是非常不同的。您传递一个匿名函数,它直接返回 1000 而不是 1000 数字。这就是它引发不同错误的原因。

【讨论】:

搜索的附加说明:这同样适用于 RxJS 5 中的 debounce()debounceTime() 另见learnrxjs.io/operators/filtering/throttletime.html

以上是关于rxjs 节流 this.durationSelector 不是函数的主要内容,如果未能解决你的问题,请参考以下文章

Angular使用总结 --- 搜索场景中使用rxjs的操作符

如何理解 RxJS?RxJS的中文API和使用教程

rxjs-tslint vs rxjs-tslint-rules 包

RxJS 6有哪些新变化?

如何在不需要 rxjs-compat 的情况下只导入 RxJS 6 中使用的运算符,如旧的 RxJS?

RxJS入门2之Rxjs的安装