void dartLoopTest() {
Future x0 = Future(() => null);
Future x = Future(() => print('1'));
Future(() => print('2'));
scheduleMicrotask(() => print('3'));
x.then((value) {
print('4');
Future(() => print('5'));
}).then((value) => print('6'));
print('7');
x0.then((value) {
print('8');
scheduleMicrotask(() {
print('9');
});
}).then((value) => print('10'));
}
flutter: 7
flutter: 3
flutter: 8
flutter: 10
flutter: 9
flutter: 1
flutter: 4
flutter: 6
flutter: 2
flutter: 5
future执行顺序
//执行顺序按照编写顺序,类似队列
//then比Future优先级高
scheduleMicrotask 微任务
1、scheduleMicrotask 比Future异步任务高
2、Future 在事件队列里面
在同级中,then 优先级 < scheduleMicrotask
在then函数中,then 优先级 > scheduleMicrotask
async 搭配await 实现同步执行
await:后面跟着一个Future,表示等待该异步任务完成,异步任务完成后才会继续往下执行。await只能出现在异步函数内部。能够让我们可以像写同步代码那样来执行异步任务而不使用回调的方式。
注意点
后面的操作必须是异步才能用awati
当前函数必须是异步函数
Dart的Event Loop
Dart的事件循环如下图所示。和JavaScript的基本一样。循环中有两个队列。一个是微任务队列(MicroTask queue),一个是事件队列(Event queue)。
在Dart中,实际上有两种队列:
事件队列(event queue),包含所有的外来事件:I/O、mouse events、drawing events、timers、isolate之间的信息传递。
微任务队列(microtask queue),表示一个短时间内就会完成的异步任务。它的优先级最高,高于event queue,只要队列中还有任务,就可以一直霸占着事件循环。microtask queue添加的任务主要是由 Dart内部产生。
在每一次事件循环中,Dart总是先去第一个microtask queue中查询是否有可执行的任务,如果没有,才会处理后续的event queue的流程。
1338189-20201210001400583-1223059831.pngDart的事件循环的运行遵循以下规则:
首先处理所有微任务队列里的微任务。
处理完所有微任务以后。从事件队列里取1个事件进行处理。
回到微任务队列继续循环。
注意第一步里的所有,也就是说在处理事件队列之前,Dart要先把所有的微任务处理完。如果某一时刻微任务队列里有8个微任务,事件队列有2个事件,Dart也会先把这8个微任务全部处理完再从事件队列中取出1个事件处理,之后又会回到微任务队列去看有没有未执行的微任务。
总而言之,就是对微任务队列是一次性全部处理,对于事件队列是一次只处理一个。
这个流程要清楚,清楚了才能理解Dart代码的执行顺序。
正常情况下,一个 Future 异步任务的执行是相对简单的:
声明一个 Future 时,Dart 会将异步任务的函数执行体放入event queue,然后立即返回,后续的代码继续同步执行。
当同步执行的代码执行完毕后,event queue会按照加入event queue的顺序(即声明顺序),依次取出事件,最后同步执行 Future 的函数体及后续的操作。
网友评论