「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战」。
前言:
上一篇我们介绍了在flutter中异步编程,继续探讨下
Future<T>类,其中T表示一个泛型的异步操作结果,如果异步操作不虚啊哟结果,类型可以是Future<void>因此Future是个泛类型,可以指定类型,也可以不指定。
上一篇我们已经介绍了Future的简单使用,配合async ,awiat以及.then等使用
1. 多个异步处理
看个简单的例子,执行的打印顺序为C-A-B
修改下添加then,C-A-B-D,then在异步操作之后调用
我们添加多个异步操作,还是有序的
我们让其中一个任务耗时一秒结果还是顺序执行
说明异步任务是放到了一个队列中,执行的顺序根据放入队列的顺序。队列是有执行顺序的。
1.1 依赖关系
我们开发中通常会有又一些依赖关系,比如请求
1.2 统一处理
还有多个任务完成后,统一处理Future.wait(futures)里面是future的数组
我们使用
.then 这个里面的value就相当于每个return的数组。他们里面的顺序是按添加顺序执行的。
2. 事件循环
正常情况下异步任务按照添加到队列的顺序
但是我们想要优先执行的话可以使用微任务scheduleMicrotask(callback)
微任务优于异步添加的队列
我们看下下面的执行顺序
主队列最先执行,其次为位队列任务,异步任务按照添加顺序执行,异步的.then紧跟着当前的异步任务,不论它的前后。
- 事件队列(
event queue),包含所有的外来事件:I/O、mouse events、drawing events、timers、isolate之间的信息传递。 - 微任务队列(
microtask queue),表示一个短时间内就会完成的异步任务。它的优先级最高,高于event queue,只要队列中还有任务,就可以一直霸占着事件循环。microtask queue添加的任务主要是由Dart内部产生。
- 嵌套
我们在异步任务中添加一个微任务,之后再执行
.then。前面的顺序都没问题,主要是7和8的顺序执行,再异步函数执行完成后会添加微任务,微任务优于异步任务。但是.then相当于异步任务的回调,所以会在异步任务执行完成后调用内部的回调,所以8之后是7.
我们把它拆开写,还是8由于7,是因为
.then的任务放到了微任务队列
我们再嵌套一层,我们按照添加的的顺序和添加顺序.then 执行。