Я использую 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))
]);
О, спасибо, я решил это, удалив скобки из петли for
Да, скобки создают набор или карту в Dart. В зависимости от содержания. Спасибо, что приняли мой ответ.
небольшая подсказка, удалите ключевое слово await
перед getPartNumber
, потому что я отправляю 4 запроса, чтобы получить 4 части, поэтому мне не нужно ждать, чтобы получить каждую часть по отдельности, я обернул 4 вызова Future.wait()
, чтобы вызывать их асинхронно и ожидание их завершения
Я подумал, что причина в этом. Но вы также можете справиться с этим с помощью Stream
(или с помощью Timer
), не используя Future.wait
.
И если вы не дождетесь запросов, вы можете превысить запрос в секунду. Но я, конечно, не знаю, как у вас регулируется этот лимит скорости.
await Future.wait([for (var i = 0; i < 4; i += 1) Future.delayed(const Duration(seconds: i)).then(...).then(...)]);