首页 > 解决方案 > 在 Dart 的队列中按执行顺序异步返回同步调用的 Futures

问题描述

void main() async {
  Future<void> asyncFunction(time, value) async {
    return await Future.delayed(Duration(seconds: time), () => print(value));
  }

  print('1');
  asyncFunction(2, "A");
  asyncFunction(1, "B");
  asyncFunction(0, "C");
  print('2');
}

根据上面的代码,我试图让代码打印为:

1
2
A
B
C

我想同步执行所有函数并将 asyncFunctions (Futures) 发送到一种队列,然后按接收顺序执行这些函数。每个函数必须等待前一个函数完成它的未来,然后它自己才会执行。

我一直在尝试使用流,但没有做对。

标签: dartasynchronousstreamqueuefuture

解决方案


如果您想要一个异步任务队列,其中添加的每个新任务都会延迟到前一个任务完成,您可以自己编写一个。

class AsyncQueue<T> {
  Future<T?> _current = Future.value(null);
  Future<T> add(FutureOr<T> Function() task) {
    FutureOr<T> wrapper(void _) => task();
    return _current = _current.then(wrapper, onError: wrapper);
  }
}

您可以将其用作:

Future<void> asyncFunction(time, value) async {
  await Future.delayed(Duration(seconds: time), () => print(value));
}
...
  var queue = AsyncQueue<void>();
  print("1");
  var f1 = queue.add(() => asyncFunction(2, "A"));
  var f2 = queue.add(() => asyncFunction(1, "B"));
  var f3 = queue.add(() => asyncFunction(0, "C"));
  print("2");
  await f3;

推荐阅读