Dart中的异步声明async await

107 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情

Dart中的异步声明async await

Dart是单线程模型,这个语言中没有子线程的概念,不依赖子线程进行异步操作。 那么在耗时的业务场景(网络请求、文件读写等),它是怎么实现异步操作呢。

Dart 和 JAVA 对比

JAVA语言是多线程模型,可以通过简单的new Thread().start()在相同的时间内可以执行多个耗时方法。 Dart语言是单线程模型,单线程代表同一时间段只能有一个方法在执行,所以它有独特的事件循环机制来执行异步操作。 事件循环机制的整体作用是,当遇到异步方法时,将异步方法放在队列中,等待其它方法执行完毕,再回过头来执行队列中的方法。

async await

async:声明方法时调用,代表该方法是个异步方法。 await:声明方法时调用,代表要等待该方法。

例子一

引用了比较好理解的一段代码:

void main() {
  fun1();
  fun2();
  fun3();
  fun4();

}

void fun1(){
  print('fun1');
}

void fun2() async{ 
  //声明耗时方法 使用async
  print('fun 2 pre');

  await Future.delayed(Duration(seconds: 2)); //调用耗时方法,使用await
  print('fun 2 after');
}

void fun3(){
  print('fun3');
}

void fun4() async{
  Future.delayed(Duration(seconds: 5));
  print('fun4');
}

输出

fun1
fun 2 pre
fun3
fun4
fun 2 after

分析

  1. fun1()执行后直接输出 fun1,接着执行fun2()
  2. fun2()是个异步方法,进入后输出fun 2 pre,接着往下执行,遇到了await,然后阻塞在这里,放入队列,其它方法还要接着执行
  3. fun3()接着执行,输出fun3
  4. fun4()执行,Future.delay虽然是个耗时方法,但没有await,所以不需要等待,直接输出fun4
  5. 接着执行队列中的方法

例子二

在网络请求中,通常这样使用,标明的序号即为执行的顺序

import 'package:http/http.dart' as http;

main() {
  _startMethod();
  print("2. C开始");
}


Future _startMethod() async{
  print("1. A开始执行这个方法~");
  print(await getHttp());
  print("4. A执行结束");
}

Future<String> getHttp() async {
  final result = await http.get('https://www.juejin.com/');
  return "3. 请求到的数据:" +  result.body.toString();
}