代码语言:javascript复制
void main() {
//dart 是一门单线程语言,但是可通过async await 将任务添加到异步队列来管理任务异步去做
//await 所在的函数必须是异步函数,async修饰的函数
getDatas1();
print('执行其他操作');
}
/*结论分析
添加到主队列的任务:
I/flutter ( 1891): 任务开始
I/flutter ( 1891): 任务4
I/flutter ( 1891): 执行其他操作
添加到异步队列的任务
I/flutter ( 1891): 任务1
I/flutter ( 1891): 任务2
I/flutter ( 1891): 任务3
无论添加到那个队列,任务在所在队列都按照添加顺序同步执行
*/
getDatas() async {
print('任务开始');
Future((){
sleep(const Duration(seconds: 5));
print('任务1');
});
Future((){
print('任务2');
});
Future((){
print('任务3');
});
print('任务4');
}
/*结论分析
I/flutter ( 1891): 任务开始
I/flutter ( 1891): 执行其他操作
I/flutter ( 1891): 任务1
I/flutter ( 1891): 任务4
I/flutter ( 1891): 任务2
I/flutter ( 1891): 任务3
*/
getDatas1() async {
print('任务开始');
await Future((){
sleep(const Duration(seconds: 5));
print('任务1');
});
//await 的效果等同于下面的任务都用then{}包起来了。
Future((){
print('任务2');
});
Future((){
print('任务3');
});
print('任务4');//先于任务2、3执行,Future是添加完当前所有任务到异步队列后在逐个执行,任务4马上就执行了
}
总结:dart 是一门单线程语言,但是可通过async await 将任务添加到异步队列来管理,来达到任务异步去执行 await 所在的函数必须是异步函数,async修饰的函数
catchaError的问题:已经抛出error了,后面代码还会继续执行,这不符合常规。官方解析是catchError
必须放到future的最后,好吧有个性。
代码语言:javascript复制futureAction() async {
Future future = Future(() {
for(int i = 0; i < 1000; i ) {
}
throw Exception('任务异常');
//return '任务完成';
});
future.catchError((e){print('$e');})
.then((value) => print('$value'))
.whenComplete(() => print('任务结束'));
// .catchError((error){print('$error');});
}
I/flutter ( 1891): Exception: 任务异常
I/flutter ( 1891): null
I/flutter ( 1891): 任务结束
多任务处理,利用future的wait包装一组任务
代码语言:javascript复制mutipleFutureAction() async {
Future future = Future.wait([
Future(() {
print('任务1');
}),
Future(() {
print('任务2');
}),
]);
future.then((value) {
print('任务1和任务2,已执行完毕');
});
}
执行顺序:同步队列->异步队列,都在主线程上执行。
代码语言:javascript复制void testFuture(){
debugPrint('外部代码1');
Future(() => debugPrint('task A')).then((value) => debugPrint('task A 结束'));
Future(() => debugPrint('task B')).then((value) => debugPrint('task B 结束'));
sleep(const Duration(seconds: 3));
debugPrint('外部代码2');
}
I/flutter ( 1559): 外部代码1
I/flutter ( 1559): 外部代码2
I/flutter ( 1559): task A
I/flutter ( 1559): task A 结束
I/flutter ( 1559): task B
I/flutter ( 1559): task B 结束