async和await方式
在Dart2中要想使用async实现类似于Java中的异步编程,必须在其修饰的异步方法中结合await关键字使用才能达到相应的效果。否则该方法仍为同步方法,并在上下文中以同步方式执行。
Version note: In Dart 1.x, async functions immediately suspended
execution. In Dart 2, instead of immediately suspending, async functions
execute synchronously until the firstawait
orreturn
.
即判断一个async方法是同步执行还是异步执行,在2.2以后是可以动态变化的:
可以以同步状态一直运行该方法(当然这时候async加与不加也没有什么意义了)。
如使用async但其中不加await,或使用await但不返回Future
可使由同步状态转变为异步状态(以下三种情形)。
Note that an async function starts executing right away (synchronously). The function suspends execution and returns an uncompleted future when it reaches the first occurrence of any of the following:
- 1.The function’s first
await
expression (after the function gets the uncompleted future from that expression). - 2.Any
return
statement in the function. - 3.The end of the function body.
对于情形1需注意:
举例
void fun() asyn{
await funA();
}
await所等待的A方法或Future API必须返回Future<T>对象,(A若返回数据类型T,await会对返回的类型T封装成Future<T>),我想说明的一点是A方法是会立刻执行的且返回Future<T>对象,并且该过程是在同一个isolate中进行的,通俗点讲就是在仍是在主线程中执行的,还未进入异步执行状态(异步状态是在稍后时间中的Futurez中)。