Rxjs throttleTime工作意外

时间:2017-01-24 21:37:54

标签: angular rxjs5

(使用角度2& NgRedux 2和ngrx 5.0.3)

usersReducer $,articlesReducer $是我从导入的模块(ngRedux)收到的匿名主题。

let merge$ = Observable.merge(this.usersReducer$, this.articlesReducer$);
  .do((data) => {
    let time = performance.now();
    console.log('%c REGULAR UPDATE ' + time, 'background: #555; color: #bada55', data);
  });

// TODO : why it doesn't work as expected?!
// The merge$ emits values, and here it only emits once and happens again only
// when the reducers change much later.
this.throttleSub = merge$
  .throttleTime(0.0000000000001)
  .do((data) => {
    let time = performance.now();
    this.refreshData();
    console.log('%c THROTTLE UPDATE ' + time, 'background: #222; color: #bada55', data);
  })
  .subscribe(() => {})

输出:enter image description here

注意:如果我以后有任何userReducer $ / articleReducer $ emit,我们会看到节流更新日志。

我最好的猜测事情正在快速发生(这就是为什么我在它之间放置0.00000001,因为1 ms会在开始时发出一次节流),但它们之间的ms差异只会让我感到惊讶对此感到不对。

非常喜欢一些帮助,我很困惑。

(使用debounceTime(1)而非节流,我们最后只得到1个去抖记录,看起来一切都不到1毫秒就不可能了!中间有一个服务器请求! )

编辑:我在Mark van Straten的评论中指出,我已经制作了.timestamp()运营商。这是输出: enter image description here

更新: 我已将时间戳链接到原点可观察状态,并将throttleTime链接到另一个订阅者,我认为现在它更清楚了。 enter image description here

1 个答案:

答案 0 :(得分:0)

http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-throttleTime

  

允许值传递,然后忽略下一个持续时间毫秒的源值。

所以行为是它发出一个值,然后计时器运行,在计时器运行完成后,它将从下游的上游发出下一个发射值。

如果你想制作一个这种行为的大理石图,它看起来像这样:

input stream:     --a-b-c---b----c--d----------a-|
throttleTime(50):   a-----| b-----| d-----|    a-|
output stream:    --a-------b-------d----------a-|