方法返回一个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修饰。

1. 没有耗时操作的 Future 方法


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

Future b() async{
  Future.delayed(Duration(seconds: 5));
  print('bbb');
  return null;
}

输出结果:

vscode-format

2. 含有耗时操作的 Future 方法

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

Future b() async{
  await Future.delayed(Duration(seconds: 5));
  print('bbb');
  return null;
}

输出结果:
等待 b 方法执行完 5s 后再打印。

vscode-format

3. 含有耗时操作不等待

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

Future b() async{
  await Future.delayed(Duration(seconds: 5));
  print('bbb');
  return null;
}

输出结果:
方法 b 中有耗时操作,但是 main 方法中没有等待 b 执行完成。

vscode-format

内容片段来自文章

————————————————
版权声明:本文为CSDN博主「乌克丽丽丶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ssq236811/article/details/107228402/

最后修改:2022 年 01 月 27 日
如果觉得我的文章对你有用,请随意赞赏或留下你的评论~