Синхронный и асинхронный обход списка в Dart

02.07.2017 at 07:41

Предположим у нас есть асинхронная функция

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
Tags: