异步编程:futures,async,await
几个关键字:
- 同步操作:一个同步操作用来在某个操作完成之前阻塞线程
- 同步方法:一个同步方法只执行同步操作
- 异步操作:异步操作允许其他操作在该异步操作完成之前开始执行
- 异步方法:异步方法至少执行一个异步操作,但同时也可以执行同步操作.
future是什么
类似于java,future是一个异步操作的结果,包含两种状态:未完成和已完成
future可以指定一个泛型如Future, 那么如果异步操作完成则可以从此future中取出一个String.
使用futures:async和await
async和await提供了定义异步方法和使用异步方法的结果的方式.使用async和await的两个基本原则:
- 在方法体前加上async来定义一个异步方法
- await关键字只能用在async方法中
如何将一个main方法转变为异步方法?
- 首先在方法体前加上async
void main() async { ··· }
- 如果异步方法有明确的返回值,则将返回值修改为Future, T就是返回值的类型.
Future<T> main() async { ··· }
如果没有明确的返回值,则返回值类型改为Future
Future<void> main() async { ··· }
main方法变成async方法后,就可以在里面使用await来等待futrue执行完成了:
Future<String> createOrderMessage() async{
var order = await fetchUserOrder();
return 'Your order is: $order';
}
Future<String> fetchUserOrder() =>
// Imagine that this function is more complex and slow.
Future.delayed(
Duration(seconds: 2),
() => 'Large Latte',
);
Future<void> main() async {
print(await createOrderMessage());
}
从上述代码可以看出,同步方法和异步方法的区别在于三点:
1. 返回值类型从String变成了Future
2. 在main()和 createOrderMessage()方法体前加上了async关键字
3. 在调用异步方法 fetchUserOrder() 和createOrderMessage()之前加上await关键字
async的作用是让方法异步执行,不受前面代码的影响.await作用是阻塞线程,等后面的异步方法执行完后再继续执行后续代码