Dart 是单线程的,利用事件循环机制来解决线程卡顿问题。
当 main 函数运行时,会生成一个事件循环机制,不断地循环 main 函数,直至 main 函数内全部事件都全部运行完毕。
在循环的时候实际上是在检查 Event Queue ( 事件队列 ),使用 Future 关键字定义的函数会产生一个 事件消息并被添加到事件消息队列。
简单地理解 :
main 函数逐行执行代码,执行完成后循环检查 Event Queue 中是否有事件,如果有就检查其是否执行完成。
这样一直循环,直至 Event Queue 中没有任何事件。
异步编程可以使我们在开发中摆脱回调地狱。dart 作为一种新生的语言,很自然的,也有await 和 async,可以顺利地实现异步编程。
那么为什么要用异步编程呢? 只用同步不能够解决吗?
其实大多情况下同步已经够用了,但是在下面的几种情况下,同步的场景还是有缺陷的。
需要花很长时间从网络上下载数据的情况。
读取数据库的耗时情况。
从文件读取数据的情况。
总结而言,如果某些操作需要花费大量的时间,那么就可以考虑使用异步编程了。
async 是方法的描述符,如果要使用 await,则必须配合 async 一起使用 :
Future<函数返回值类型> 函数名称() async {
var *** = await ****();
}
// await后面一般接着的是Future对象。
Future<String> GetIP() async {
return Future.delayed(Duration(seconds: 1), () => "127.0.0.1");
}
void main(List<String> args) {
Future IPFuture = GetIP();
IPFuture.then((ip) {
print(ip);
}).onError((error, stackTrace) {
print(error);
print(stackTrace);
});
}