认识 Dart 异步编程 async/await 关键字(二)
async/await
在中,我们初步认识了 Dart 异步编程,以及代表异步操作结果的Future对象。
如果异步任务过多,超过三个以上,在代码层面上,造成多层“倒三角”,使阅读性大大降低。
getHobbies() {
post('http://api.example.com/get/user/${userId}').then((user) {
post('http://api.example.com/get/tags/${user.id}').then((tags) {
post('http://api.example.com/get/hobbies/${user.id}').then((hobbies) {
print(hobbies);
});
});
});
}
async/await关键可以解决上诉“倒三角”现象,并使代码的阅读性大大提高,也利于代码的书写。
getHobbies() async {
User user = await post('http://api.example.com/get/user/${userId}');
Tags tags await post('http://api.example.com/get/tags/${user.id}');
Hobbies hobbies = await post('http://api.example.com/get/hobbies/${user.id}');
print(hobbies);
}
async用于函数,在函数小阔号后面添加代表此函数是一个异步函数。await用在阻塞任务前,例如,获取用户是一个网络请求,且此任务会发生一个等待,那么在前面添加上await关键字即可。
实际操作
写一个让线程休眠 10 秒钟的函数。
Future waitFuture() {
return Future(() {
sleep(Duration(seconds: 10));
});
}
Future(FutureOr,当中的 computation 等待异步任务执行完成,假若异步任务出现异常,将返回一个携带错误的 Future 对象。
执行waitFuture:
void main() {
waitFuture().then((value) {
print('completed.');
});
}
10 秒之后,completed 被打印到控制台,成功完成了异步任务。
现在,使用async/await简化上面的操作:
void main() async {
await waitFuture();
print('completed.');
}
等待waitFuture任务完成之后,才会进行下一步任务,10 秒之后,complete 才会被打印到控制台。