用Future防止垃圾邮件,等待在 Flutter 中

bqf10yzr  于 2022-12-30  发布在  Flutter
关注(0)|答案(1)|浏览(171)

我有一个反DDOS规则在我的服务器与最大20个请求在1秒。
在我的flutter程序中,我想调用一个API n次,但有时n大于20。如何避免一些问题
这里我的代码(不工作似乎)

// Search token informations
      final tokenMap = <String, Token>{};
      var antiSpam = 0;
      final getTokens = await Future.wait(
        tokenAddressList.toSet().map((final tokenAddress) async {
          if (antiSpam > 0 && antiSpam % 19 == 1) {
            return Future.delayed(const Duration(seconds: 1));
          } else {
            antiSpam++;
            return sl.get<ApiService>().getToken(
              [tokenAddress],
             
            );
          }
        }),
      );
u3r8eeie

u3r8eeie1#

您的实现将无法按预期工作,因为Future.delayed函数没有暂停代码的执行,而是计划在经过一定的持续时间后调用函数。
使用Future.wait而不使用forLoop可能无法实现将请求数限制为每秒20的预期效果,因为所有API调用都是并行的,将同时启动,并且仍可能超过速率限制。
要实现您的目标,可以在forLoop中使用asyncawait,并按顺序添加所有API调用,每20个请求延迟1秒。
下面是一个如何修改代码以实现此目的的示例:

final tokenMap = <String, Token>{};
int antiSpam = 0;

List<Future> futures = [];

for (final tokenAddress in tokenAddressList.toSet()) {
  // Delay the adding of API call if we have made more than 20 requests
  if (antiSpam > 0 && antiSpam % 19 == 0) {
    await Future.delayed(const Duration(seconds: 1));
  }

  // Add the API call and update the antiSpam counter
  futures.add(sl.get<ApiService>().getToken([tokenAddress]));
  antiSpam++;
}

final getTokens = await Future.wait(futures);

相关问题