我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 次
uj5u.com熱心網友回復:
為什么你不能只使用一個 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))
]);
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/446328.html