如何运行多个异步函数以使其被调用(FIFO?)

时间:2019-04-08 22:17:58

标签: dart flutter dart-async

我已经花了很多时间寻找解决方案,但是由于我是Dart的乞讨人,所以我一个人也找不到。 我想要实现的是为一些异步函数创建一些类似的队列,这些异步函数是在应用程序运行时从代码的不同点随机调用的(例如,当用户点击我的应用程序中的按钮时)。我希望它们按照调用的顺序执行,所以基本上我有一个异步方法,例如 updateDate() updatePoints(),当用户点击按钮X时updateDate()将被调用(添加到队列中),与Y和updatePoints()类似。当用户点击i时。 e。 X,X,Y我要按照此确切顺序运行updateDate(),updateDate(),updatePoints()。当一项任务完成时,另一项正在启动。我想我不能用等待来实现这一目标。任何提示将不胜感激!

2 个答案:

答案 0 :(得分:2)

在用于大量任务时,以下代码可能不是一个好习惯,但是,如果您确定任务数组不会超过足够的大小,则可能会很好:

Future<List<T>> runOneByOne<T>(List<T Function()> list) {
  if (list.isEmpty) {
    return Future.value(null);
  }
  Future task = Future<T>.microtask(list.first);
  final List<T> results = [];

  for (var i = 1; i < list.length; i++) {
    final func = list[i];
    task = task.then((res) { results.add(res); return Future<T>.microtask(func); });
  }

  return task.then((res) { results.add(res); return results; });
}

通过将一个Future包装到另一个results中,按原始顺序一个接一个地执行功能。 try {...}数组用于存储返回的值,最后返回所有值。

如果遇到错误,执行将停止并抛出。在这种情况下,结果数组丢失。您可以在每个microtask包装器中添加null闭包,以忽略错误并在该特定任务中返回results,并在runOneByOne<int>([ () { print("First"); return 1; }, () { print("Second"); return 2; }, () { print("Third"); return 3; }, ]).then((results) { print(results); // List<int> [ 1, 2, 3 ] }); 数组中保留其他值。

用法示例:

<form method= 'POST' action = "{% url 'jobs:pinned'%}">
{% csrf_token%}

 <input type ="text" name = "number">
<input type="submit" value="Submit">
</form>

答案 1 :(得分:1)

State

结果:

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); }); } }