「这是我参加11月更文挑战的第22天,活动详情检查:2021最终一次更文挑战」
咱们在前面已经大致了解了Flutter
中Future
的运行机制,那么除了Future
,Flutter
中是否还有其他使命机制呢?
咱们先来看一段代码:
void testFuture() {
print('外部代码1');
Future(() => print('使命A')).then((value) => print('A使命结束'));
Future(() => print('使命B')).then((value) => print('B使命结束'));
print('外部代码2');
}
依照咱们在之前文章中介绍的Future
的用法及履行流程,咱们很容易就能猜到运行成果:
那么,如果在代码运行过程中,忽然有紧急使命需求先履行,那么有没有方法处理呢?这就要使用到微使命来做处理了;
scheduleMicrotask
scheduleMicrotask
又称为微使命
,咱们将代码修正一下,增加一个微使命看一下代码的履行流程发生了什么变化?咱们将代码修正如下:
void testFuture() {
print('外部代码1');
Future(() => print('使命A')).then((value) => print('A使命结束'));
Future(() => print('使命B')).then((value) => print('B使命结束'));
scheduleMicrotask(() {
print('微使命A');
});
sleep(const Duration(seconds: 1));
print('外部代码2');
}
在代码的履行流程中增加了scheduleMicrotask
微使命,那么代码的履行成果是什么呢?
根据打印信息,咱们发现咱们在Future
后边增加的scheduleMicrotask
微使命居然优先履行了;scheduleMicrotask
拥有较高的优先级,从而咱们也能够确定在这段代码履行的过程中是有两个行列存在的,否则微使命不发优先履行;
Dart中的行列
在Dart
中是有两种对类存在的:
-
event queue
事情行列:这种行列包含所有的外来事情,如I/O
、mouse events
、drawing events
、timers
和Isolate
等之间的信息传递; -
microtask queue
微使命行列:这种行列表示一个短时刻内就会完成的异步使命。它的优先级最高,只需此行列中还有使命,就能够一向强占着事情循环。microtask queue
增加的使命主要是由Dart
内部发生的。
需求留意的是,正因为
microtask queue
行列的优先级高于event queue
行列,所以如果在microtask queue
中的微使命过多,那么就有或许一向强占当时的事情循环(event loop
)。从而对event queue
中的接触、制作等事情发生影响,导致这些时刻发生阻塞卡顿;
在每一次的事情循环中,Dart
总是会优先在microtask queue
行列中查询是否还有可履行的使命,如果该行列中没有需求处理的使命,那么才会处理event queue
行列中的使命及其流程;
在异步使命中,咱们使用的最多的仍是优先级较低的event queue
。Dart
中为event queue
的使命做了一层封装,也便是咱们之前使用过的Future
;
Dart
中Future
异步使命的履行流程:
- 声明一个
Future
时,Dart
会将异步使命的函数履行体放入event queue
中,然后立即返回,后续的代码继续进行同步履行; - 当同步履行的代码履行结束后,
event queue
会依照参加的次序也便是声明次序,顺次取出事情,最终同步履行Future
的函数体及后续操作;
事情示例
咱们来界说一串使命,代码如下:
void testFuture() {
Future f1 = Future(() => null);
f1.then((value) {
print('6');
}).then((value) => print('7'));
Future f2 = Future(() => print('1'));
f2.then((value){
print('4');
});
Future(() => print('2'));
scheduleMicrotask(() {
print('3');
});
print('5');
}
依照咱们对Future
使命履行次序的理解,以及scheduleMicrotask
具有较高优先级的履行权,那么其打印次序应该是:
5、3、6、7、1、4、2
咱们检查打印成果:
确实和咱们预料的相同,那么咱们将代码作如下修正呢?
void testFuture() {
Future f1 = Future(() => null);
f1.then((value) {
print('6');
scheduleMicrotask(() {
print('8');
});
}).then((value) => print('7'));
Future f2 = Future(() => print('1'));
f2.then((value){
print('4');
});
Future(() => print('2'));
scheduleMicrotask(() {
print('3');
});
print('5');
}
咱们在f1
的使命中,增加了一个微使命,那么咱们来看一下此时的打印成果:
看到这个成果,咱们不免会发生疑问?scheduleMicrotask
是微使命,那么他的优先级应该是最高的,那么8
为什么会在7
的后边打印呢?
此处需求留意的是,then
内部的代码,咱们能够看做这部分代码被扔在了微使命行列中,而scheduleMicrotask
虽然也是微使命,但是此时它仅仅是扔在了微使命行列中,当时的微使命行列中还有打印7
的使命,所以最终是7
在8
的前边打印;