持续创作,加速成长!这是我参与「掘金日新计划 · 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
分析
- fun1()执行后直接输出 fun1,接着执行fun2()
- fun2()是个异步方法,进入后输出fun 2 pre,接着往下执行,遇到了await,然后阻塞在这里,放入队列,其它方法还要接着执行
- fun3()接着执行,输出fun3
- fun4()执行,Future.delay虽然是个耗时方法,但没有await,所以不需要等待,直接输出fun4
- 接着执行队列中的方法
例子二
在网络请求中,通常这样使用,标明的序号即为执行的顺序
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();
}