首先Dart是一门单线程的语言,那么Dart对异步操作对支持,可以使我们在编写Dart程序时可以异步的来执行耗时操作。从而可以在等待一个操作完成的同时进行别的操作以下是一些常见的异步操作:
-
通过网络获取数据。
-
写入数据库。
-
从文件读取数据。
要在Dart中执行异步操作,可以使用Future类和async和await关键字。
# Dart的事件循环(event loop)
在Dart中,实际上有两种队列:
-
事件队列(
event queue),包含所有的外来事件:I/O、mouse events、drawing events、timers、isolate之间的信息传递。 -
微任务队列(
microtask queue),表示一个短时间内就会完成的异步任务。它的优先级最高,高于event queue,只要队列中还有任务,就可以一直霸占着事件循环。microtask queue添加的任务主要是由Dart内部产生。
因为
microtask queue的优先级高于event queue,所以如果microtask queue有太多的微任务, 那么就可能会霸占住当前的event loop。从而对event queue中的触摸、绘制等外部事件造成阻塞卡顿。
在每一次事件循环中,Dart总是先去第一个microtask queue中查询是否有可执行的任务,如果没有,才会处理后续的event queue的流程。
异步任务我们用的最多的还是优先级更低的 event queue。Dart为 event queue 的任务建立提供了一层封装,就是我们在Dart中经常用到的Future。
正常情况下,一个 Future 异步任务的执行是相对简单的:
-
声明一个
Future时,Dart会将异步任务的函数执行体放入event queue,然后立即返回,后续的代码继续同步执行。 -
当同步执行的代码执行完毕后,
event queue会按照加入event queue的顺序(即声明顺序),依次取出事件,最后同步执行Future的函数体及后续的操作。
# Future
Future<T> 类,其表示一个 T 类型的异步操作结果。如果异步操作不需要结果,则类型为 Future<void>。也就是说首先Future是个泛型类,可以指定类型。如果没有指定相应类型的话,则Future会在执行动态的推导类型。
# Future基本用法
# Future工厂构造函数
什么是工厂构造函数?
工厂构造函数是一种构造函数,与普通构造函数不同,工厂函数不会自动生成实例,而是通过代码来决定返回的实例对象。
在Dart中,工厂构造函数的关键字为factory。我们知道,构造函数包含类名构造函数和命名构造方法,在构造方法前加上factory之后变成了工厂构造函数。也就是说factory可以放在类名函数之前,也可以放在命名函数之前。
下面我们通过Future的工厂构造函数,创建一个最简单的Future。

可以看到,Future的工厂构造函数接收一个Dart函数作为参数。这个函数没有参数,返回值是FutureOr<T>类型。
从打印结果可以看出,Future不需要结果时,返回的类型是 Future<void>。
注意,是先执行的类型判断,后打印的Future内的操作。
# async和await
默认的Future是异步运行的。如果想要我们的Future同步执行,可以通过async和await关键字:

可以看到,我们的Future已经同步执行了。await会等待Future执行结束后,才会继续执行后面的代码。
关键字async和await是Dart语言异步支持的一部分。
异步函数<

本文深入探讨Dart的异步编程,包括事件循环、Future的基本用法,如Future.value()、Future.delayed(),以及async和await的使用。通过实例展示了Future.then()、Future.catchError()、Future.whenComplete()等方法,还介绍了Future.timeout()、Future.foreach()、Future.wait()等高级用法。
最低0.47元/天 解锁文章
550

被折叠的 条评论
为什么被折叠?



