这是 Dart 入门教程最后一篇,主要分享 async
和 await
关键词以及 Future
类来处理异步编程。我这里直接提供两个例子来学习他们的使用。
main(List<String> args) {
print("main function start");
Future.delayed(Duration(seconds: 3), () {
return "3秒后的信息";
}).then((value) {
print(value);
});
print("main function end");
}
上面的程序运行后,将看到以下输出
main function start
main function end
(3秒钟后...)
3秒后的信息
为什么会这样执行,这里涉及到 Future
的两个 API 。 Future.delayed
,传入一个 Duration
对象,表示延迟时间为 3 秒。这意味着在 3 秒后,传入的回调函数(() { return "3秒后的信息"; }
)将被执行。
接着使用 then
方法,在 Future.delayed
完成后执行一个回调。另外,main
函数会在等待 Future.delayed
的过程中继续执行。所以会先执行出:
main function start
main function end
为什么会这样呢,为什么 Future
的代码明明在前面,结果最后执行。
和 JAVA 另开线程启动异步任务不一样,Dart 使用单线程事件循环模型来处理异步操作,在 Dart 中,Future
对象用于在事件循环中表示未来会完成的某个操作的结果。再通俗点说,我们可以将耗时操作放到 Future
任务中。接着再来学习 async
和 await
关键字。还是上面的案例,修改成如下:
Future<String> delayedMessage() async {
return Future.delayed(Duration(seconds: 3), () {
return "3秒后的信息";
});
}
void main() async {
print("main function start");
String message = await delayedMessage();
print(message);
print("main function end");
}
上述代码执行后,打印结果
main function start
(3秒钟后...)
3秒后的信息
main function end
为什么这个类执行结果顺序和上面不一样呢?就是关键词 await
和 async
的使用。main
函数中,使用 await
关键字等待 delayedMessage()
的结果。await
会暂停当前函数的执行,直到等待的异步操作完成。
有两个“定理”,await
关键字必须在一个用 async
标记的函数内部使用,也就是方法内用了 await
,这个方法函数必须用 async
修饰。其次, 如果一个方法用 asnyc
修饰标记,这个函数应该返回一个 Future
类型。像下面这个方法:
Future<String> delayedMessage() async {
return Future.delayed(Duration(seconds: 3), () {
return "3秒后的信息";
});
}
OK,以上就是我要分享的,也是 Dart 入门教程最后一篇。
本文由老郭种树原创,转载请注明:https://guozh.net/dart-getting-started-tutorial-await-and-async/