async方法中遇到await时即会返回一个Future对象,从字面上也能知道这个一个未来的值,那么肯定需要等待完成之后才能获取到里面的值。then关键字的意思就是获取等待执行完毕之后返回的值,光说感觉说不明白,还是来看一段代码吧:
void main() {
new Future(() => futureTask())//异步任务的函数
.then((i) => "result:$i")//任务执行完后的子任务
.then((m) => print(m)); //其中m为上个任务执行完后的返回的结果
}
futureTask() {
return 10;
}
上面这段代码中只有一个打印,下面是打印出的值:
result:10
为什么不只显示10呢?因为第二次then的时候参数m是第一次then返回的值,而不是futureTask()返回的10这里应该不难理解。
在then之后还可以抛异常,下面来抛一个异常来看看:
new Future(() => futureTask())//异步任务的函数
.then((i) => "result:$i")//任务执行完后的子任务
.then((m) => print(m)) //其中m为上个任务执行完后的返回的结果
.then((_) => Future.error("出错了"));
从上面代码中可以知道抛异常的方法Future.error(“出错了”),来看一下执行情况:
result:10
Unhandled exception:
出错了
#0 _rootHandleUncaughtError.<anonymous closure> (dart:async/zone.dart:1114:29)
#1 _microtaskLoop (dart:async/schedule_microtask.dart:43:21)
#2 _startMicrotaskLoop (dart:async/schedule_microtask.dart:52:5)
#3 _Timer._runTimers (dart:isolate-patch/timer_impl.dart:393:30)
#4 _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:418:5)
#5 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:174:12)
既然可以抛异常了,当然也可以catch异常,直接使用catchError关键字来捕获一下:
new Future(() => futureTask())//异步任务的函数
.then((i) => "result:$i")//任务执行完后的子任务
.then((m) => print(m)) //其中m为上个任务执行完后的返回的结果
.then((_) => Future.error("出错了"))
.catchError(print);
写法很简单,直接参照上面代码写即可,下面是运行结果:
result:10
出错了
已经捕获了一场,需要做什么事的可以在里面进行操作了。
对了,标题中还有一个关键字没说,whenComplete,这个关键字的意思简单,指所有任务完成后的回调函数,使用也很简单,直接看代码:
new Future(() => futureTask())//异步任务的函数
.then((i) => "result:$i")//任务执行完后的子任务
.then((m) => print(m)) //其中m为上个任务执行完后的返回的结果
.then((_) => Future.error("出错了"))
.catchError(print)
.whenComplete(() => print("whenComplete"));//所有任务完成后的回调函数
看一下运行结果:
result:10
出错了
whenComplete
很简单对吧?下面说的就有点恶心了。。