在Dart1.9中加入了async和await关键字,有了这两个关键字,咱们能够更简洁的编写异步代码,而不须要调用Future相关的API。他们容许你像写同步代码同样写异步代码和不须要使用Future接口。至关于都Future相关API接口的另外一种封装,提供了一种更加简便的操做Future相关API的方法java
将 async 关键字做为方法声明的后缀时,具备以下意义异步
Async/await
也是能够实现异步操做,下面直接上例子:main() {
create();
}
void create(){ String data = getData(); print(data); print("I love Future"); }
getData() async{ return await "I love Android"; }
运行上面代码,报错了:async
type 'Future<dynamic>' is not a subtype of type 'String'
报的是类型不匹配?为何呢?通过一番搜查,发现getData
是一个异步操做函数,它的返回值是一个await
延迟执行的结果。在Dart
中,有await
标记的运算,其结果值是一个Future
对象,Future
并非String类型,就报错了。那么怎么才正确得到异步的结果呢?Dart规定async标记的函数,只能由await来调用,下面改为这样:函数
main() { create(); } void create() async{ String data = await getData(); print(data); print("I love Future"); }
getData() async{ return await "I love Android"; }
下面直接去掉async
函数包装,直接在getData
方法里对data
进行赋值:spa
String data; main() { create(); }
void create(){ getData(); print("I love Future"); }
getData() async{ data = await "I love Android"; print(data); }
上面输出结果是:code
I love Future
I love Android
能够发现,先输出的是I love Future
后面再输出I love Android
,能够发现当函数被async
修饰时,会先去执行下面的操做,当下面的操做执行完,而后再执行被async
修饰的方法。async
用来表示函数是异步的,定义的函数会返回一个Future
对象,await
后面是一个Future
,表示等待该异步任务完成,异步完成后才会往下走。要注意如下几点:对象
PS: await 关键字真的很形象,等一等的意思,就是说,既然你运行的时候都要等一等,那我调用的时候也要等等吧。
main() { _startMethod(); _method_C(); } _startMethod() async{ _method_A(); await _method_B(); print("start结束"); }
_method_A(){ print("A开始执行这个方法~"); } _method_B() async { print("B开始执行这个方法~"); await print("后面执行这句话~"); print("继续执行这句哈11111~"); } _method_C(){ print("C开始"); }
结果以下:blog
A开始执行这个方法~ B开始执行这个方法~ 后面执行这句话~ C开始 继续执行这句哈11111~ start结束
过程分析:
接口
也就是首先执行_startMethod
这个方法用async声明了,由于方法里调用了_method_A
,因此先输出print("A开始执行这个方法~");,后面执行_method_B()
,这个方法用await关键字声明,因此会暂停print("start结束");的执行,而后继续执行_method_B()
将print("B开始执行这个方法~");输出,下一行遇到await关键字,会暂停其余代码的执行。当await关键字引用的Future执行完成(也就是执行print("后面执行这句话~"),_method_C()
方法会当即执行,而后执行继续执行这句哈11111~,最后执行print("start结束"); _startMethod_method_A_method_B()_method_B()_method_C()