Dart的事件循环的运行遵循以下规则:
- 首先处理所有微任务队列里的微任务。
- 处理完所有微任务以后。从事件队列里取1个事件进行处理。
- 回到微任务队列继续循环。
那么在Dart中如何让你的代码异步执行呢?很简单,把要异步执行的代码放在微任务队列或者事件队列里就行了。
1. Future
Future提供了一系列构造函数供你选择。
创建一个立刻在事件队列里运行的Future:
Future(() => print('立刻在Event queue中运行的Future'));
创建一个延时1秒在事件队列里运行的Future:
Future.delayed(const Duration(seconds:1), () => print('1秒后在Event queue中运行的Future'));
创建一个在微任务队列里运行的Future:
Future.microtask(() => print('在Microtask queue里运行的Future'));
创建一个同步运行的Future:
Future.sync(() => print('同步运行的Future'));
这个同步运行指的是构造Future的时候传入的函数是同步运行的,这个Future通过then串进来的回调函数是调度到微任务队列异步执行的。
2. Completer
当你创建了一个Completer以后,其内部会包含一个Future。你可以在这个Future上通过then, catchError和whenComplete串上你需要的回调。拿着这个Completer实例,在你的代码里的合适位置,通过调用complete函数即可完成这个Completer对应的Future。控制权完全在你自己的代码手里。当然你也可以通过调用completeError来以异常的方式结束这个Future。
3. async/await
用同步代码的形式写出异步代码
- await只能在async函数中出现。
- async函数中可以出现多个await,每遇见一个就返回一个Future, 实际结果类似于用then串起来的回调。
- async函数也可以没有await, 在函数体同步执行完毕以后返回一个Future。
网友评论