Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 如何按调用顺序运行多个异步函数(FIFO?)_Dart_Flutter_Dart Async - Fatal编程技术网

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

Dart 如何按调用顺序运行多个异步函数(FIFO?),dart,flutter,dart-async,Dart,Flutter,Dart Async,我花了很多时间寻找解决方案,但由于我是Dart begginer,我自己找不到。 我想要实现的是为一些异步函数创建类似queue的东西,这些函数在应用程序运行时从不同的代码点随机调用(比如,当用户在我的应用程序中点击按钮时)。我希望按照调用顺序执行它们,因此基本上我有异步方法,例如updateDate()和updatePoints(),当用户点击按钮X时,将调用updateDate()(添加到队列中),类似于Y和updatePoints()。当用户点击i时。E十、 X,Y我想按照这个确切的顺序运

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

导入'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。”感谢您的回复。这正是我想要的。我想我已经很接近了。