Dart中的Future、await和async

Dart中的Future、await和async

总述:经过观察代码现象,总算搞懂了这三个东西的关系

方法返回一个Future表示该方法中含有耗时操作,当执行到耗时操作的时候,该方法就直接返回一个Future,从而使得调用该方法的外层方法不去理会该耗时操作继续执行后面的代码避免阻塞;值得注意的是如果一个方法声明返回的类型是Future对象,但其内部根本没有耗时操作,那么该方法根本就没有必要声明返回一个Future。而对于一个含有耗时操作的方法(返回Future)来说,虽然在其调用的地方该方法返回了一个Future,但是在该方法自己内部是阻塞了的(阻塞在await处)。await关键字的作用就是等待耗时操作,比如一个http.get方法是一个耗时操作,其返回Future<Response>,如果调用的时候没有用await修饰,那么代码执行到http.get处时直接跳过(因为http.get返回的是Future)从而避免阻塞,但是如果调用的时候声明了await,那么方法会阻塞到http.get处,且调用http.get的方法也会返回Future(因为其内部含有耗时操作).而出现await的方法必须用async修饰。

实例一:不含有耗时操作的Future方法

Future b() async{
  Future.delayed(Duration(seconds: 5));
  print("this is b");
  return null;
}

void main() async {
  print(DateTime.now().millisecondsSinceEpoch);
   await b();
  print(DateTime.now().millisecondsSinceEpoch);
}  

输出:

1552139136057
this is b
1552139136075  

在main方法调用b()的地方不管是不是用await,其还是按序执行的,因为虽然b方法返回值是Future,但是其根本不含耗时操作

实例二:含有耗时操作的Future方法

Future b() async{
  await Future.delayed(Duration(seconds: 5));
  print("this is b");
  return null;
}

void main() async {
  print(DateTime.now().millisecondsSinceEpoch);
   await b();
  print(DateTime.now().millisecondsSinceEpoch);
}  

输出

1552139291290
this is b
1552139296311  

可见由于b方法中使用了await等待delayed5秒钟,所以b中含有了耗时操作,因此如果main方法中调用b的时候也使用了await选择等待b完成,那么两次输出就会相差5秒钟

实例三:含有耗时操作不等待

Future b() async{
  await Future.delayed(Duration(seconds: 5));
  print("this is b");
  return null;
}

void main() async {
  print(DateTime.now().millisecondsSinceEpoch);
   b();
  print(DateTime.now().millisecondsSinceEpoch);
}  

输出

1552139467356
1552139467368
this is b

可见,虽然b方法中含有耗时操作,但是main方法中没有选择等待b的完成,所以打印的时间间隔很小

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 接着上节 condition_varible ,本节主要介绍future的内容,练习代码地址。本文参考http:/...
    jorion阅读 14,895评论 1 5
  • 第一章:Java程序设计概述 Java和C++最大的不同在于Java采用的指针模型可以消除重写内存和损坏数据的可能...
    loneyzhou阅读 1,301评论 1 7
  • 一、并发 进程:每个进程都拥有自己的一套变量 线程:线程之间共享数据 1.线程 Java中为多线程任务提供了很多的...
    SeanMa阅读 2,589评论 0 11
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,170评论 1 32
  • 大家好 我是早安学会创始人,早起2倍速学习践行者李小军。 今天分享的主题是“给年轻人的三个建议”。 1、 更加自信...
    李子心诚阅读 798评论 1 4