Flutter - Dart - 线程 Future、async、await

1,471 阅读1分钟

编译环境: VSCode版本: 1.46.0 ,Dart版本: v3.11.0,Flutter版本: v3.11.0

线程 Future、async、await

Dart通常是单线程执行

String fun1(){
  return '1';
}
String fun2(){
  return '2';
}
String fun3(){
  return '3';
}
void test1(){
  print(fun1());
  print(fun2());
  print(fun3());
}


异步方法

  • 如果是执行的网络请求、访问数据库或文件等,那么方法不会立刻返回结果,需要一定的执行时间。这时不能一直,这时情况下,可以使用Future来描述未来的结果
Future<String> fun4 = new Future(fun1); //fun4 就是未来的结果

  • async与 await 将异步方法同步方法操作
  • async 描述一个执行异步操作的方法
  • await表示一直等待异步返回结果,才继续往后执行
 Future<String> fun5() async {
     return '5';
 }
  void test2() async {
    fun1();
    String f5 = await fun5(); //这里需要有返回异步的结果之后才会往后执行
    print(f5);
    test1();
  }
  • wait并行执行

同时执行了多个网络请求,等所有结果都返回后再执行操作,返回一个List的结果集


 Future<String> fun6() async {
   return '6';
 }
 Future<String> fun7() async {
   return '7';
 }
 Future<String> fun8() async {
   return '8';
 }

void test3(){
  Future.wait([fun6(),fun7(),fun8()]).then((List responses){
       print(responses);   
  }).catchError((error){
     print(error);
  });
}

链式调用

多个网络请求,后者需要前者的返回值当做参数,最后一个才是想要的值


Future<int> fun9() async {
  return 9;
}
Future<int> fun10(int p) async {
  return p +10;
}

Future<int> fun11(int p) async {
  return p + 11;
}
void test4(){
  fun9().then((value9){
     print('value9 = $value9');
     return fun10(value9);
  }).then((value10){
      print('value10 = $value10');
      return fun11(value10); 
  }).then((value11){
      print('value11 = $value11');
  });
}


main(List<String> args) {
  
 test1(); // 1 2 3

//未来的结果获取,使用then
fun4.then((String value){
    print('value1 = $value');
});
  
 test2();
 test3(); //[6,7,8]
 test4();//value9 = 9  value10 = 19  value11 = 30
}