速率限制器

速率限制是一种限制操作的策略。它会限制一个人在特定时间段内重复执行某项操作的次数。使用 rate_limiter,我们比以往任何时候都更容易将这些策略应用于常规的 dart 函数。

安装

将以下内容添加到您的 pubspec.yaml 文件中,并将 [version] 替换为最新版本

dependencies:
  rate_limiter: ^[version]

策略

防抖

防抖函数 将忽略所有对它的调用,直到调用停止一段时间。只有到那时,它才会调用原始函数。例如,如果我们指定时间为两秒,并且防抖函数在每两次调用之间间隔一秒的情况下被调用 10 次,那么在最后一次(第十次)调用之后两秒钟之前,该函数都不会调用原始函数。

用法

使用 rate_limiter 创建防抖函数非常简单

  1. 从头开始创建
final debouncedFunction = debounce((String value) {  
  print('Got value : $value');  
  return value;  
}, const Duration(seconds: 2));
  1. 将现有函数转换为防抖函数
String regularFunction(String value) {  
  print('Got value : $value');  
  return value;  
}  
  
final debouncedFunction = regularFunction.debounced(  
  const Duration(seconds: 2),  
);

示例

通常,搜索框会提供下拉列表,为用户当前输入提供自动完成选项。有时,建议的选项是通过 API 从后端获取的(例如,在 Google Maps 中)。自动完成 API 会在搜索查询更改时被调用。如果没有防抖,您每输入一个字母就会调用一次 API,即使您输入得非常快。通过一秒的防抖,可以确保自动完成函数在用户停止输入一秒后才执行任何操作。

final debouncedAutocompleteSearch = debounce(
  (String searchQuery) async {
    // fetches results from the api
    final results = await searchApi.get(searchQuery);
    // updates suggestion list
    updateSearchSuggestions(results);
  },
  const Duration(seconds: 1),
);

TextField(
  onChanged: (query) {
    debouncedAutocompleteSearch([query]);
  },
);

节流

节流 函数意味着确保函数在指定的时间段内最多只被调用一次(例如,每 10 秒一次)。这意味着节流会防止函数在“最近”运行后再次运行。节流还能确保函数以固定的速率规律地运行。

用法

创建节流函数与创建防抖函数类似

  1. 从头开始创建
final throttledFunction = throttle((String value) {  
  print('Got value : $value');  
  return value;  
}, const Duration(seconds: 2));
  1. 将现有函数转换为节流函数
String regularFunction(String value) {  
  print('Got value : $value');  
  return value;  
}  
  
final throttledFunction = regularFunction.throttled(  
  const Duration(seconds: 2),  
);

示例

在动作游戏中,用户通常通过按下按钮来执行一个关键动作(例如,射击、挥拳)。但是,任何游戏玩家都知道,用户可能会因为动作的兴奋和强度而比必要时按更多次按钮。因此,用户可能在 5 秒内按下“挥拳”按钮 10 次,但游戏角色每秒只能挥出一拳。在这种情况下,对动作进行节流是有意义的。在这种情况下,将“挥拳”动作节流到每秒一次将忽略每秒的第二次按钮按下。

final throttledPerformPunch = throttle(
  () {
    print('Performed one punch to the opponent');
  },
  const Duration(seconds: 1),
);

RaisedButton(
  onPressed: (){
    throttledPerformPunch();
  }
  child: Text('Punch')
);

挂起

用于检查是否还有函数需要调用。

final pending = debouncedFunction.isPending;
final pending = throttledFunction.isPending;

刷新

用于立即调用所有剩余的延迟函数。

final result = debouncedFunction.flush();
final result = throttledFunction.flush();

取消

用于取消所有剩余的延迟函数。

debouncedFunction.cancel();  
throttledFunction.cancel();

GitHub

https://github.com/GetStream/rate_limiter