如何使用循环给 `Future.wait()` 一个 Futures 列表

How to use a loop to give `Future.wait()` a list o Futures

我正在使用 Future.wait() 获取一些数据,如下面的代码所示:
我调用函数 Future.delayed() 在每次调用之间等待 1 秒,因为我将限制设置为每秒 1 个请求

    await Future.wait([

        Future.delayed(const Duration(milliseconds: 1000))
            .then((value) => getPartNumber(1)
            .then((value) => addPartToList((value.data)))),

        Future.delayed(const Duration(milliseconds: 2000))
            .then((value) => getPartNumber(2)
            .then((value) => addPartToList((value.data)))),

        Future.delayed(const Duration(milliseconds: 3000))
            .then((value) => getPartNumber(3)
            .then((value) => addPartToList((value.data)))),

        Future.delayed(const Duration(milliseconds: 4000))
            .then((value) => getPartNumber(4)
            .then((value) => addPartToList((value.data)))),

    ]);

所以我想做的是使用循环而不是手动重复调用 4 次

为什么你不能只使用 for 循环并在中间等待 1 秒以不超过速率限制。

for(int i = 1; i <= 4; i++){
  await Future.delayed(const Duration(seconds: 1));
  await getPartNumber(i).then((value) => addPartToList(value.data));
}

这也确保每秒不超过一个请求进入,因为中间的时间是等待的。 或者,如果您希望以与代码中相同的方式处理等待时间,以下方法也适用:

await for(var i in Stream.periodic(const Duration(seconds: 1), (i)=>i).take(5)){
  if(i == 0) continue;
  await getPartNumber(i).then((value) => addPartToList(value.data));
}

或者如果你真的想用 Future.wait() 来做,我个人不喜欢,这里是如何做的:

await Future.wait(
  Iterable.generate(4, (i)=>Future.delayed(const Duration(seconds: i + 1))
    .then((value) => getPartNumber(i + 1))
    .then((value) => addPartToList(value.data))
);

await Future.wait([
  for(int i = 1; i <= 4; i++)
    Future.delayed(const Duration(seconds: i))
      .then((value) => getPartNumber(i)
      .then((value) => addPartToList(value.data))
]);