gpt4 book ai didi

dart - 如何按调用顺序运行多个异步函数(FIFO?)

转载 作者:IT王子 更新时间:2023-10-29 06:51:00 24 4
gpt4 key购买 nike

我花了很多时间寻找解决方案,但由于我是 Dart 初学者,我无法自己找到它。我想要实现的是在应用程序运行时从代码中的不同点为一些随机调用的异步函数(比方说,当用户点击我的应用程序中的按钮时)创建类似队列的东西。我希望它们按照调用的顺序执行,所以基本上我有异步方法,例如 updateDate()updatePoints() 以及当用户点击按钮 X 时updateDate() 将被调用(添加到队列),与 Y 和 updatePoints() 类似。当用户点击 i 时。 e. X, X, Y 我想按照这个确切的顺序运行 updateDate()、updateDate()、updatePoints()。当一项任务完成时,另一项任务即将开始。我想我不能使用 await 来实现这一点。任何提示将不胜感激!

最佳答案

import 'dart:async';
import 'dart:collection';
import 'dart:math';

Future<void> main() async {
_simulateRealWork();
}

Scheduler _scheduler = Scheduler();

class Scheduler {
bool _scheduled = false;

Queue<Future Function()> _queue = Queue<Future Function()>();

void schedule(Future Function() task) {
_queue.add(task);
if (!_scheduled) {
_scheduled = true;
Timer(Duration(seconds: 0), _execute);
}
}

Future _execute() async {
while (true) {
if (_queue.isEmpty) {
_scheduled = false;
return;
}

var first = _queue.removeFirst();
await first();
}
}
}

void _simulateRealWork() {
var maxPeriod = 5;
var count = 5;
for (var i = 0; i < count; i++) {
print('Timer $i');
var random = Random();
Timer(Duration(seconds: random.nextInt(maxPeriod)), () {
print('Scheduled work $i');
Future work() async {
print('Started work $i');
await Future.delayed(Duration(seconds: random.nextInt(maxPeriod)));
print('Ended work $i');
}

_scheduler.schedule(work);
});
}
}

结果:


定时器 0
定时器 1
定时器 2
定时器 3
定时器 4
预定工作 2
开始工作 2
预定工作 0
预定工作 3
结束工作 2
开始工作 0
预定工作 1
预定工作 4
结束工作 0
开始工作 3
结束工作 3
开始工作 1
结束工作 1
开始工作 4
结束工作 4

关于dart - 如何按调用顺序运行多个异步函数(FIFO?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55582540/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com