Dart 如何按调用顺序运行多个异步函数(FIFO?)
我花了很多时间寻找解决方案,但由于我是Dart begginer,我自己找不到。 我想要实现的是为一些异步函数创建类似queue的东西,这些函数在应用程序运行时从不同的代码点随机调用(比如,当用户在我的应用程序中点击按钮时)。我希望按照调用顺序执行它们,因此基本上我有异步方法,例如updateDate()和updatePoints(),当用户点击按钮X时,将调用updateDate()(添加到队列中),类似于Y和updatePoints()。当用户点击i时。E十、 X,Y我想按照这个确切的顺序运行updateDate(),updateDate(),updatePoints()。当一项任务完成时,另一项任务开始。我想我不能用等待来实现这一点。任何提示都将不胜感激Dart 如何按调用顺序运行多个异步函数(FIFO?),dart,flutter,dart-async,Dart,Flutter,Dart Async,我花了很多时间寻找解决方案,但由于我是Dart begginer,我自己找不到。 我想要实现的是为一些异步函数创建类似queue的东西,这些函数在应用程序运行时从不同的代码点随机调用(比如,当用户在我的应用程序中点击按钮时)。我希望按照调用顺序执行它们,因此基本上我有异步方法,例如updateDate()和updatePoints(),当用户点击按钮X时,将调用updateDate()(添加到队列中),类似于Y和updatePoints()。当用户点击i时。E十、 X,Y我想按照这个确切的顺序运
导入'dart:async';
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);
});
}
}
导入“dart:集合”;
导入“dart:math”;
Future main()异步{
_模拟工作();
}
调度器_Scheduler=Scheduler();
类调度程序{
bool_scheduled=false;
队列_Queue=Queue();
作废计划(Future Function()任务){
_添加(任务);
如果(!\u计划){
_预定=真;
计时器(持续时间(秒数:0),_执行);
}
}
Future\u execute()异步{
while(true){
if(_queue.isEmpty){
_预定=假;
返回;
}
var first=_queue.removeFirst();
首先等待();
}
}
}
void(模拟工作){
var maxPeriod=5;
var计数=5;
对于(变量i=0;i
结果:
计时器0
计时器1
计时器2
计时器3
计时器4
计划工作2
开始工作2
计划工作0
计划工作3
结束工作2
已开始工作0
计划工作1
计划工作4
结束工作0
开始工作3
结束工作3
开始工作1
结束工作1
开始工作4
结束工作4
当在大型任务队列中使用以下代码时,可能是一种不好的做法,但如果您确信任务数组不会超过适当的大小,则这可能很好:
Future runOneByOne(列表){
if(list.isEmpty){
返回Future.value(空);
}
Future task=Future.microtask(list.first);
最终列表结果=[];
对于(变量i=1;i
它通过将一个Future
包装到另一个中,以原始顺序逐个执行函数<代码>结果数组用于存储返回的值,最后返回所有值
如果偶然发现错误,执行将停止并抛出。结果数组在这种情况下丢失。您可以将try{…}
闭包添加到每个microtask
包装器中,以忽略错误并在该特定任务中返回null
,从而在结果
数组中保留其他值
用法示例:
runOneByOne([
(){打印(“第一”);返回1;},
(){打印(“第二次”);返回2;},
(){打印(“第三”);返回3;},
]).然后((结果){
打印(结果);//列表[1,2,3]
});
如果所有内容都必须同步,为什么要使用异步?但是你可以试试这个。。。doSomethingAsync()。然后(()=>doAnotherAsync());我不确定这会有多深work@stuckedoverflow好吧,如果一切都是同步的,那就没有问题了。见-文档中说:“为iterable中的每个元素安排行动调用。一次挂起的行动调用不会超过maxTasks。”感谢您的回复。这正是我想要的。我想我已经很接近了。