dart系列之:dart中的异步编程-阿里云开发者社区

开发者社区> 公众号:程序那些事> 正文

dart系列之:dart中的异步编程

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

简介

熟悉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/

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

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10076 0
使用NAT网关轻松为单台云服务器设置多个公网IP
在应用中,有时会遇到用户询问如何使单台云服务器具备多个公网IP的问题。 具体如何操作呢,有了NAT网关这个也不是难题。
26789 0
阿里云服务器ECS远程登录用户名密码查询方法
阿里云服务器ECS远程连接登录输入用户名和密码,阿里云没有默认密码,如果购买时没设置需要先重置实例密码,Windows用户名是administrator,Linux账号是root,阿小云来详细说下阿里云服务器远程登录连接用户名和密码查询方法
11612 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
9158 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13884 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
4503 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
7365 0
+关注
公众号:程序那些事
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧,尽在程序那些事!
277
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载