1、Dart是单线程模型
Dart是单线程的,那么如何实现耗时操作呢?
Dart是基于单线程加事件循环来完成耗时操作的处理。
2、Dart事件循环
事件循环是什么呢?
- 事实上事件循环并不复杂,它就是将需要处理的一系列事件(包括点击事件、IO事件、网络事件)放在一个事件队列(Event Queue)中。
- 不断的从事件队列(Event Queue)中取出事件,并执行其对应需要执行的代码块,直到事件队列清空。 image.png
3、Dart的异步操作
- 使用Future实现异步
import 'dart:io';
main(List<String> args) {
print("----- start ------");
//getData();
getNetData().then((value){
print(value);
});
print("----- end ------");
}
//耗时操作,等待3秒
String getData(){
sleep(Duration(seconds: 3));
return "----- 返回数据 ----";
}
//异步操作
Future<String> getNetData() {
return Future<String>(() {
sleep(Duration(seconds: 3));
return "----- 异步返回数据 ----";
});
}
查看控制台输出,返回数据方法并没有被等待,而是最后返回。
----- start ------
----- end ------
----- 异步返回数据 ----
Future的其他用法:
import 'dart:io';
main(List<String> args) {
print("----- start ------");
//getData();
getNetData().then((value) {
print(value);
});
//链式调用
getNetData().then((value1) {
print(value1);
return "----- second data ------";
}).then((value2) {
print(value2);
return "----- third data ------";
}).then((value3) {
print(value3);
});
Future.value("----- hello future").then((value){
print(value);
});
getErrorData().then((value) {
print(value);
}).catchError((error) {
print(error);
});
getNetworkData().then((value){
print(value);
});
print("----- end ------");
}
//耗时操作,等待3秒
String getData() {
sleep(Duration(seconds: 3));
return "----- 返回数据 ----";
}
//异步操作
Future<String> getNetData() {
return Future<String>(() {
sleep(Duration(seconds: 3));
return "----- 异步返回数据 ----";
});
}
//抛出异常
Future<String> getErrorData() {
return Future<String>(() {
sleep(Duration(seconds: 3));
throw Exception("网络请求出现错误");
});
}
//使用 await+async 实现异步,返回的是Future类型
Future<String> getNetworkData() async {
var result = await Future.delayed(Duration(seconds: 3), () {
return "network data";
});
return "----- " + result;
}
控制台输出:
----- start ------
----- end ------
----- hello future
----- 异步返回数据 ----
----- 异步返回数据 ----
----- second data ------
----- third data ------
Exception: 网络请求出现错误
----- network data
- 使用await、async实现异步
//使用 await+async 实现异步,返回的是Future类型
Future<String> getNetworkData() async {
var result = await Future.delayed(Duration(seconds: 3), () {
return "network data";
});
return "----- " + result;
}
网友评论