dart - 在 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) 发送到一种队列,然后按接收顺序执行这些函数。每个函数必须等待前一个函数完成它的未来,然后它自己才会执行。
我一直在尝试使用流,但没有做对。
解决方案
如果您想要一个异步任务队列,其中添加的每个新任务都会延迟到前一个任务完成,您可以自己编写一个。
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;
推荐阅读
- c - 访问指针内的指针数组
- go - 执行闭包 goroutine 未能达到预期结果
- excel - 将文件上传到 SharePoint,不使用 UNC 或驱动器映射
- flutter - ListTile 字幕用卡片颤动修改
- tensorflow - 在 2020 年 TF 峰会上实施“使用 Tensorflow 学习阅读”演讲 - Tensorflow 2.1/2.2 中的 EncoderDecoder Seq2Seq 模型 - 自定义训练步骤
- java - 单击开始按钮时程序崩溃
- javascript - 必须提交两次才能使 props.history.push 生效
- java - 角度上传图像并将其保存在spring-backend中
- python - Python Scipy v1.1.0 Kendall tau-b p值计算
- c# - 加密连接字符串 - 允许其他机器解密