如何使用循环给 `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))
]);
我正在使用 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))
]);