Flutter学习-21-异步处理和Dart的事件循环

264 阅读2分钟

「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战」。

前言:

上一篇我们介绍了在flutter中异步编程,继续探讨下 Future<T>类,其中T表示一个泛型的异步操作结果,如果异步操作不虚啊哟结果,类型可以是Future<void>因此Future是个泛类型,可以指定类型,也可以不指定。
上一篇我们已经介绍了Future的简单使用,配合asyncawiat以及.then等使用

1. 多个异步处理

看个简单的例子,执行的打印顺序为C-A-B

image.png

修改下添加then,C-A-B-D,then在异步操作之后调用

image.png

我们添加多个异步操作,还是有序的

image.png

我们让其中一个任务耗时一秒结果还是顺序执行

image.png

说明异步任务是放到了一个队列中,执行的顺序根据放入队列的顺序。队列是有执行顺序的。

1.1 依赖关系

我们开发中通常会有又一些依赖关系,比如请求

image.png

1.2 统一处理

还有多个任务完成后,统一处理Future.wait(futures)里面是future的数组

image.png 我们使用.then 这个里面的value就相当于每个return的数组。他们里面的顺序是按添加顺序执行的。

2. 事件循环

正常情况下异步任务按照添加到队列的顺序 image.png

但是我们想要优先执行的话可以使用微任务scheduleMicrotask(callback)

image.png 微任务优于异步添加的队列

我们看下下面的执行顺序

image.png

主队列最先执行,其次为位队列任务,异步任务按照添加顺序执行,异步的.then紧跟着当前的异步任务,不论它的前后。

  1. 事件队列(event queue),包含所有的外来事件:I/Omouse eventsdrawing eventstimersisolate之间的信息传递。
  2. 微任务队列(microtask queue),表示一个短时间内就会完成的异步任务。它的优先级最高,高于event queue,只要队列中还有任务,就可以一直霸占着事件循环。microtask queue添加的任务主要是由 Dart内部产生。

image.png

  • 嵌套

image.png 我们在异步任务中添加一个微任务,之后再执行.then。前面的顺序都没问题,主要是7和8的顺序执行,再异步函数执行完成后会添加微任务,微任务优于异步任务。但是.then相当于异步任务的回调,所以会在异步任务执行完成后调用内部的回调,所以8之后是7.

image.png 我们把它拆开写,还是8由于7,是因为.then的任务放到了微任务队列

image.png

我们再嵌套一层,我们按照添加的的顺序和添加顺序.then 执行。