Синхронный и асинхронный обход списка в Dart
Предположим у нас есть асинхронная функция
Future doWork(int val) async { print("start ${val}"); await new Future.delayed(new Duration(seconds: 2)); print("finish ${val}"); }
и массив чисел
List<int> list = [1, 2, 3, 4, 5];
если мы последовательно вызовем для всех элементов массива функцию doWork
Future main() async { list.forEach((int val) => doWork(val)); }
то результат будет вот таким:
start 1 start 2 start 3 start 4 start 5 finish 1 finish 2 finish 3 finish 4 finish 5
Чаще всего это нормально, но бывают ситуации, когда функция doWork должна одновременно работать только для одного элемента. Добиться такого синхронного поведения можно с помощью цикла for
Future main() async { for (var i = 0; i < list.length; i++) { await doWork(list[i]); } }
В этом случае на консоли будет
start 1 finish 1 start 2 finish 2 start 3 finish 3 start 4 finish 4 start 5 finish 5