RXJS-油门时间不油门

时间:2019-08-04 05:59:18

标签: javascript rxjs throttling debounce

我有一个使用React函数component的简单点击事件,我尝试使用RxJS throttleTime进行限制。我在throttle500ms的每次点击似乎都完全停止,但是当我使用去抖时,它仍然有效。

import React, { useState, useRef } from "react";
import { throttleTime, debounceTime } from "rxjs/operators";
import { Subject } from "rxjs";

const subject = new Subject();

function Button() {
  const btn = useRef();
  const [clickCount, updateClick] = useState(0);
  const [debounceCount, updateDebounced] = useState(0);
  const [throttleCount, updateThrottled] = useState(0);
  const onClicked = e => {
    updateClick(parseInt(e.target.value, 10) + 1);
    subject.next(parseInt(e.target.value, 10) + 1);
  };
  subject.pipe(debounceTime(500)).subscribe(d => updateDebounced(d));
  subject.pipe(throttleTime(400)).subscribe(d => updateThrottled(d));
  return (
    <div className="button">
      <button value={clickCount} ref={btn} onClick={onClicked}>
        CLICK
      </button>
      <div>Actual clicks: {clickCount}</div>
      <div>Debounced clicks: {debounceCount}</div>
      <div>Throttle click: {throttleCount}</div>
    </div>
  );
}

问题在于,每次点击clickCountthrottleCount会同时增加,但是debounceCount会按预期工作,它会等待500ms并进行更新。

working live demo

1 个答案:

答案 0 :(得分:0)

每次状态更改时都会调用组件函数Button(),因此您将在每个状态更改时进行新的订阅。这就是为什么它看起来不起作用的原因。

相反,订阅应该进入useEffect()

useEffect(() => {
  subject.pipe(throttleTime(400)).subscribe(d => updateThrottled(d));
}, []);

另请参阅How to call loading function with React useEffect only once