Future
Future表示一个异步操作的最终完成及其结果的表示。简单来说Future就是用来处理异步操作的,异步处理成功了就执行成功的操作,异步处理失败了就捕获错误或者停止后续操作。
一个Future只会对应一个结果,要么成功,要么失败;需要注意的是,Future的所有API的返回值仍然是一个Future对象
void getData(){
print('开始');
Future((){
print('耗时操作开始');
sleep(Duration(seconds: 3));
print('耗时操作结束');
});
print('结束');
}
打印结果为:
flutter: 开始
flutter: 结束
flutter: 耗时操作开始
flutter: 耗时操作结束
await/async
-
async用来表示函数是异步的,定义的函数会返回一个Future对象,可以使用then方法添加回调函数;
-
await后面是一个Future,表示等待该异步任务完成,异步完成后才会继续往下执行;await必须出现在async函数内部;
我们来看一段代码:
void getData() async {
print('开始');
await Future((){
print('耗时操作开始');
sleep(Duration(seconds: 3));
print('耗时操作结束');
});
print('结束');
}
打印结果为:
flutter: 开始
flutter: 耗时操作开始
flutter: 耗时操作结束
flutter: 结束
then
可以看到下方代码,因为Future是异步操作,方法执行了开始、结束后开始执行Future内部代码,当Future内部代码执行完毕后才开始执行then函数。
void getData() {
print('开始');
Future((){
print('耗时操作开始');
sleep(Duration(seconds: 3));
print('耗时操作结束');
return 'success';
})
.then((value){
print('then函数调用 value = $value');
});
print('结束');
}
打印结果为:
flutter: 开始
flutter: 结束
flutter: 耗时操作开始
flutter: 耗时操作结束
flutter: then函数调用 value = success
但是如果我们加上async/await呢
可以看到先执行开始,然后需要等待Future执行完后才能执行结束,Future内就按照顺序执行了
void getData() async {
print('开始');
await Future((){
print('耗时操作开始');
sleep(Duration(seconds: 3));
print('耗时操作结束');
return 'success';
})
.then((value){
print('then函数调用 value = $value');
});
print('结束');
}
打印结果为:
flutter: 开始
flutter: 耗时操作开始
flutter: 耗时操作结束
flutter: then函数调用 value = success
flutter: 结束
catchError/onError
如果catchError在then方法前面,即使在catchError中捕获了异常,那么then方法依然会执行
catchError是在整个Future的链式调用过程中捕获异常,而onError只在当前then中处理,我们在一个链式调用的过程中可能存在多个then
可以看到,使用then中的onError方法捕获错误之后,catchError将不会调用
void getData() {
print('开始');
Future((){
print('耗时操作开始');
// sleep(Duration(seconds: 3));
print('耗时操作结束');
throw Exception('我发生了崩溃');
return 'success';
})
.then((value){
print('then函数调用 value = $value');
})
.catchError((e){
print('catchError捕获的异常为;${e.toString()}');
})
.whenComplete((){
print('全部执行完毕');
});
print('结束');
}
打印结果为:
flutter: 开始
flutter: 结束
flutter: 耗时操作开始
flutter: 耗时操作结束
flutter: catchError捕获的异常为;Exception: 我发生了崩溃
flutter: 全部执行完毕
whenComplete
我们的异步任务无论成功与失败,都需要去做一些其他事情的时候,就可以使用whenComplete