大鹏一日同风起,扶摇直上九万里。这篇文章主要讲述#yyds干货盘点#dart系列之:dart中的异步编程相关的知识,希望能为你提供帮助。
简介熟悉javascript的朋友应该知道,在ES6中引入了await和async的语法,可以方便的进行异步编程,从而摆脱了回调地狱。dart作为一种新生的语言,没有理由不继承这种优秀的品质。很自然的,dart中也有await和async语言,一起来看看吧。
为什么要用异步编程那么为什么要用异步编程呢? 只用同步不能够解决吗?
其实大多情况下同步已经够用了,但是在下面的几种情况下,同步的场景还是有缺陷的。
- 需要花很长时间从网络上下载数据的情况。
- 读取数据库的耗时情况。
- 从文件读取数据的情况。
怎么使用async是方法的描述符,如果要使用await,则必须配合async一起使用:
Future< void> checkVersion() async {
var version = await lookUpVersion();
// Do something with version
}
注意,await后面一般接着的是Future对象。先看一个错误使用异步编程的例子:
String createOrderMessage() {
var order = fetchUserOrder();
return Your order is: $order;
}
Future< String> fetchUserOrder() =>
Future.delayed(
const Duration(seconds: 2),
() => Order one!,
);
void main() {
print(createOrderMessage());
}
上面的代码本意是打印出从数据库耗时取出的数据,但是结果并不是想象的那样,其原因就是fetchUserOrder方法是一个异步方法,所以不会立即返回,从而导致结果打印失败。
将上面的代码用async改写:
Future< String> createOrderMessage() async {
var order = await fetchUserOrder();
return Your order is: $order;
}
Future< String> fetchUserOrder() =>
Future.delayed(
const Duration(seconds: 2),
() => Large Latte,
);
Future< void> main() async {
print(Fetching user order...);
print(await createOrderMessage());
}
Future上面我们在使用async和await的过程中使用到了Future。在java中Future表示的是线程的执行结果。在dart中Future表示的是一个异步执行的结果。
Future有两种状态:uncompleted 或者 completed。
当最开始执行一个异步函数的时候,会返回一个未完成的Future。这个未完成的Future会等等异步执行的完成或者失败。
不管异步程序是成功还是失败,最终都会返回一个完成状态。
async返回的Future可以接泛型,表示的时候返回的具体类型,比如Future 表示的是返回一个字符串,而 Future表示不返回任何值。
下面是两个不同返回的例子:
Future< String> fetchUserOrder() {
return Future.delayed(const Duration(seconds: 2), () => Large Latte);
}
Future< void> fetchUserOrder() {
return Future.delayed(const Duration(seconds: 2), () => print(Large Latte));
}
下面是一个异常的例子:
Future< void> fetchUserOrder() {
return Future.delayed(const Duration(seconds: 2),
() => throw Exception(Logout failed: user ID is invalid));
}
异步异常处理在async的函数中,对await的异步方法中抛出的异常,可以直接是用try catch来进行异常的捕获:
try {
print(Awaiting user order...);
var order = await fetchUserOrder();
} catch (err) {
print(Caught error: $err);
}
在同步函数中调用异步函数上面介绍的fetchUserOrder()返回的是一个Future,表示的是一个异步执行的过程。
那么如果是一个同步的方法,比如main()函数中,如何去调用异步方法,并且得到返回值呢?
await肯定是不行的,因为await只能在async的方法中调用。这个时候就可以用到then语句:
fetchUserOrder().then(order=> do something);
then语句会等待异步执行返回结果,然后对结果进行处理,实际上就等同于javascript中的回调。
总结【#yyds干货盘点#dart系列之:dart中的异步编程】以上就是dart中async和await的用法。
本文已收录于 ??http://www.flydean.com/12-dart-async/??
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!
推荐阅读
- 知识图谱的最新进展关键技术和挑战
- WP Mail SMTP版本1.5.1不发送测试邮件
- 更改CSS的Wp-less-cache问题
- WP输入框显示白色背景,即使我更改为”background-color(none;” (使bulider最大化))
- wp functions.php不会排队js脚本
- wp数据库还原/迁移后,WP Customizer主题设置消失
- wp.??customize不是函数
- wp contact form 7将表单保存到数据库并邮寄
- WP COMPRESS_CSS