异步是什么?
Dart 代码运行在单个执行“线程”中。如果 Dart 代码在执行时阻塞,例如:处理一个需要长时间运行的计算操作或等待 I/O 完成。此时整个程序会被“冻结”。
异步操作可以让你的程序在等待一个操作完成时继续处理其它的工作。
Dart 使用 Future
对象来表示异步操作的结果。
你可以用 async
和 await
关键字或 Future
类的相关 API 来配合使用 future。
Future
future 是 Future<T> 类的对象,其表示一个 T
类型的异步操作结果。如果异步操作不需要结果,则 future 的类型可为 Future<void>
。当一个返回 future 对象的函数被调用时,会发生两件事
-
将函数操作列入队列等待执行并返回一个未完成的
Future
对象。 -
不久后当函数操作执行完成,
Future
对象变为完成并携带一个值或一个错误。
Future.value()
创建一个返回指定value值的Future。
void main(){
yibu();
print("yibu()执行之后打印");
}
Future<void> yibu() async {
var result = await Future.value(1);
print("future value :${result}");
}
Future.delayed()
创建一个延迟执行的Future
void main() {
yibu();
delayYibu();
print("yibu()执行之后打印");
}
void delayYibu() {
Future.delayed(const Duration(seconds: 2), () {
print("Future.delayed 2 seconds.");
});
}
处理Future的结果
Future的所有API的返回值仍然是一个Future对象,所以可以很方便的进行链式调用。
Future.then()
用来注册一个Future完成时要调用的回调。如果 Future 有多个then,它们也会按照链接的先后顺序同步执行,同时也会共用一个event loop。
// then:Future完成时要调用的回调
void thenYibu(){
Future.value(1).then((value) async {
var result = await Future.value(value+2);
print("then value:${result}");
return result;
}).then((value) async {
var result = await Future.value(value+2);
print("then value:${result}");
return result;
});
}
Future.catchError回调只处理原始Future抛出的错误,不能处理回调函数抛出的错误,then中onError只能处理当前Future的错误:
Future.whenComplete
Future.whenComplete 在Future完成之后总是会调用,不管是错误导致的完成还是正常执行完毕。
async 和 await
当你写的代码依赖flutter对象时,可以使用关键字 async 和 await 关键字
异步函数 即在函数头中包含关键字 async
的函数。关键字 await
只能用在异步函数中。
错误处理
如果一个 Future
在函数返回完成时有错误,你可能想要捕获该错误。异步函数中可以使用 try-catch 语句来处理错误