Dart中的Future、await和async

Dart中的Future、await和async

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

方法返回一个Future表示该方法中含有耗时操作,当执行到耗时操作的时候,该方法就直接返回一个Future,从而使得调用该方法的外层方法不去理会该耗时操作继续执行后面的代码避免阻塞;值得注意的是如果一个方法声明返回的类型是Future对象,但其内部根本没有耗时操作,那么该方法根本就没有必要声明返回一个Future。而对于一个含有耗时操作的方法(返回Future)来说,虽然在其调用的地方该方法返回了一个Future,但是在该方法自己内部是阻塞了的(阻塞在await处)。await关键字的作用就是等待耗时操作,比如一个http.get方法是一个耗时操作,其返回Future,如果调用的时候没有用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的完成,所以打印的时间间隔很小

你可能感兴趣的:(Dart中的Future、await和async)