dart语法1
dart语法2-内置类型
dart语法3-函数
dart语法4-操作符
dart语法5-异常
dart语法6-类
dart语法7-泛型
dart语法8-库
dart语法9-异步
dart语法10-生成器
dart语法11
异步
async和await
await关键字必须在async函数内部使用
await表达式可以使用多次
void main(){
getName1();
getName2();
getName3();
}
Future getName1() async {
await getStr1();
await getStr2();
print('getName1’);
}
getStr1() {
print('getStr1’);
}
getStr2() {
print('getStr2’);
}
getName2() {
print('getName2’);
}
getName3() {
print('getName3’);
}
then,catchError,whenComplete
如果需要监听“完毕”这个状态,那么用whenComplete,需要监听“成功”这个状态,用then,需要监听“失败”这个状态,用catchError。
如果重写了test方法,test返回true就可以在catchError的onError方法里捕获到异常,如果test返回false,就把该异常继续抛出而不会在catchError方法里被捕获,如果不写test默认实现一个返回true的test方法
void main() {
new Future(() => futureTask())//异步任务的函数
.then((m) => "result:$m")//任务执行完后的子任务
.then((m) => m.length) //其中m为上个任务执行完后的返回的结果
.then((m) => printLength(m))
.catchError(print)
.whenComplete(() => whenTaskCompelete());//所有任务完成后的回调函数
}
Event-Looper
一个消息循环的职责就是不断从消息队列中取出消息并处理他们直到消息队列为空。
消息队列中的消息可能来自用户输入,文件I/O消息,定时器等。例如上图的消息队列就包含了定时器消息和用户输入消息。
Dart中的Main Isolate只有一个Event Looper,但是存在两个Event Queue: Event Queue以及Microtask Queue。
![](https://img.haomeiwen.com/i2754914/63e10e027022e229.png)
![](https://img.haomeiwen.com/i2754914/3df5e61695eec9c4.png)
![](https://img.haomeiwen.com/i2754914/19b62785f14da2de.png)
Event Queue和Microtask Queue
优先全部执行完Microtask Queue中的Event。
直到Microtask Queue为空时,才会执行Event Queue中的Event。
当Event Looper正在处理Microtask Queue中的Event时候,Event Queue中的Event就停止了处理了,此时App不能绘制任何图形,不能处理任何鼠标点击,不能处理文件IO等等。
绘制图形,处理鼠标点击,处理文件IO等都是在Event Queue里完成的。
![](https://img.haomeiwen.com/i2754914/bb5697d67f38fc2f.png)
任务调度
- 使用Future类,可以将任务加入到Event Queue的队尾
-
使用scheduleMicrotask函数,将任务加入到Microtask Queue队尾
优先全部执行完Microtask Queue中的Event。
直到Microtask Queue为空时,才会执行Event Queue中的Event。
图片.png
new Future()
使用new Future将任务加入event队列。
Future中的then并没有创建新的Event丢到Event Queue中,而只是一个普通的Function Call,在FutureTask执行完后,立即开始执行。
如果在then()调用之前Future就已经执行完毕了,那么任务会被加入到microtask队列中,并且该任务会执行then()中注册的回调函数。
使用Future.value构造函数的时候,就会上一条一样,创建Task丢到microtask Queue中执行then传入的函数。
Future.sync构造函数执行了它传入的函数之后,也会立即创建Task丢到microtask Queue中执行。
当任务需要延迟执行时,可以使用new Future.delay()来将任务延迟执行。
void main(){
testFuture();
}
void testFuture() {
Future f = new Future(() => print('f1'));
Future f1 = new Future(() => null);
//Future f1 = new Future.delayed(Duration(seconds: 1) ,() => null);
Future f2 = new Future(() => null);
Future f3 = new Future(() => null);
f3.then((_) => print('f2'));
f2.then((_) {
print('f3');
new Future(() => print('f4'));
f1.then((_) {
print('f5');
});
});
f1.then((m) {
print('f6');
});
print('f7');
}
scheduleMicrotask()
如果可以,尽量将任务放入event队列中。
使用Future的then方法或whenComplete方法来指定任务顺序。
为了保持你app的可响应性,尽量不要将大计算量的任务放入这两个队列。
大计算量的任务放入额外的isolate中。
import 'dart:async';
void main(){
testFuture();
}
void testScheduleMicrotask(){
scheduleMicrotask(() => print('s1'));
new Future.delayed(new Duration(seconds: 1), () => print('s2'));
new Future(() => print('s3')).then((_) {
print('s4');
scheduleMicrotask(() => print('s5'));
}).then((_) => print('s6'));
new Future(() => print('s7'));
scheduleMicrotask(() => print('s8'));
print('s9');
}
网友评论