简介

熟悉javascript的朋友应该知道,在ES6中引入了await和async的语法,可以方便的进行异步编程,从而摆脱了回调地狱。dart作为一种新生的语言,没有理由不继承这种优秀的品质。很自然的,dart中也有await和async语言,一起来看看吧。

为什么要用异步编程

那么为什么要用异步编程呢? 只用同步不能够解决吗?

其实大多情况下同步已经够用了,但是在下面的几种情况下,同步的场景还是有缺陷的。

  1. 需要花很长时间从网络上下载数据的情况。
  2. 读取数据库的耗时情况。
  3. 从文件读取数据的情况。

总结而言,如果某些操作需要花费大量的时间,那么就可以用到异步编程了。

怎么使用

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中的回调。

总结

以上就是dart中async和await的用法。

本文已收录于 http://www.flydean.com/12-dart-async/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

最新文章

  1. hibernate中表关系为多对多时,如何只删除中间表数据
  2. RStudio技巧01_美化RStudio的帮助页面
  3. Learning to Rank 之 listwise ranking
  4. 通过VMwarek可以安装Android_x86
  5. AngularJs 脏值检查及其相关
  6. 全选,不选,反选 jquery
  7. Android那些事儿之LBS定位,实践测试lbs
  8. 使用 StoryBoard 的时候加入用户引导页面
  9. GridView使用CommandField删除列实现删除时提示确认框
  10. jqGrid中多选
  11. 一天JavaScript示例-点击图片显示大图片添加鼠标
  12. 从头开始学JavaScript (二)——变量及其作用域
  13. DeepLearning.ai学习笔记(三)结构化机器学习项目--week2机器学习策略(2)
  14. python写一个信息收集四大件的脚本
  15. 什么是CRUD
  16. WEBBASE篇: 第四篇, CSS知识2
  17. 配置Linux下vim自动缩进等功能
  18. HTML5实现手机QQ表情功能
  19. vim 颜色主题设置
  20. powershell 远程重启/关闭服务器

热门文章

  1. 由于坏块导致DG的mrp0进程中断
  2. 题解 [ZJOI2019]语言
  3. 电脑(windows)端口被占用如何解决
  4. SpringCloud微服务实战——搭建企业级开发框架(四):集成SpringCloud+SpringBoot
  5. 【Java虚拟机4】Java内存模型(硬件层面的并发优化基础知识--缓存一致性问题)
  6. 395.至少有 K 个重复字符的最长子串
  7. 服务器端的GPU使用
  8. OO第四单元作业总结及课程总结
  9. Noip模拟7 2021.6.11
  10. 2021.9.13考试总结[NOIP模拟52]