javascript - 使用 rxjs 限制回调

标签 javascript rxjs

我正在使用一个 API,我在其中注册了一个经常发生的回调。

function myCallback(event) {
  // do things with event, something computationally intensive
}

const something = createSomething({
  onSomethingHappened: myCallback
})

我想限制触发此回调的速率,可能使用throttle。这个项目使用 Angular 来捆绑 rx。我如何调整我的代码,以便 myCallback 使用 rx 将其限制在 300 毫秒?

我对 observable 的工作原理有基本的了解,但弄清楚回调接口(interface)如何转换为 observable 接口(interface)有点令人困惑。

(根据答案进行编辑)

最佳答案

我认为你可以使用 fromEventPattern:

let something;

const src$ = fromEventPattern(
  handler => (something = createSomething({ onSomethingHappened: handler })),
);

src$.pipe(
  throttleTime(300),
  map(args => myCallback(args))
);

注意:这里假定 myCallback 是一个同步操作。

传递给 fromEventPattern 的第一个参数是 addHandler。它还可以有 removeHandler,您可以在其中放置拆卸逻辑(例如:从内存中释放、清空值等)。


为了更好地理解什么是handler以及为什么要用它,让我们看看fromEventPattern是如何实现的:

return new Observable<T | T[]>(subscriber => {
  const handler = (...e: T[]) => subscriber.next(e.length === 1 ? e[0] : e);

  let retValue: any;
  try {
    retValue = addHandler(handler);
  } catch (err) {
    subscriber.error(err);
    return undefined;
  }

  if (!isFunction(removeHandler)) {
    return undefined;
  }

  // This returned function will be called when the observable
  // is unsubscribed. That is, on manual unsubscription, on complete, or on error.
  return () => removeHandler(handler, retValue) ;
});

Source .

如您所见,通过 handler,您可以在需要发出某些东西时让返回的可观察对象。

关于javascript - 使用 rxjs 限制回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62029663/

相关文章:

javascript - mootools fx.reveal

javascript - RxJSskipUntil 运算符的行为不符合预期

typescript - 使用 rxjs5 在 typescript 中构建无限滚动列表

javascript - 如何使用正则表达式获取此处的日期?

Javascript:将数组作为可选方法参数传递

javascript - 使用下拉菜单和 Javascript 显示隐藏 Div?

rxjs - RXJS:节流时间加上最后一个值

angular - TypeError : You provided an invalid object where a stream was expected. 您可以提供一个 Observable、Promise、Array 或 Iterable

angular - 在 Angular 2、RxJS 中重用代码——订阅者体内的重复代码

javascript - Node.js/Grunt - 无法运行 Grunt 的 watch - 为什么?