简介
相熟javascript的敌人应该晓得,在ES6中引入了await和async的语法,能够不便的进行异步编程,从而解脱了回调天堂。dart作为一种新生的语言,没有理由不继承这种优良的品质。很天然的,dart中也有await和async语言,一起来看看吧。
为什么要用异步编程
那么为什么要用异步编程呢? 只用同步不可能解决吗?
其实大多状况下同步曾经够用了,然而在上面的几种状况下,同步的场景还是有缺点的。
- 须要花很长时间从网络上下载数据的状况。
- 读取数据库的耗时状况。
- 从文件读取数据的状况。
总结而言,如果某些操作须要破费大量的工夫,那么就能够用到异步编程了。
怎么应用
async是办法的描述符,如果要应用await,则必须配合async一起应用:
Future<void> checkVersion() async { var version = await lookUpVersion(); // Do something with version}
留神,await前面个别接着的是Future对象。
先看一个谬误应用异步编程的例子:
String createOrderMessage() { var order = fetchUserOrder(); return 'Your order is: $order';}Future<String> fetchUserOrder() => Future.delayed( const Duration(seconds: 2), () => 'Order one!', );void main() { print(createOrderMessage());}
下面的代码本意是打印出从数据库耗时取出的数据,然而后果并不是设想的那样,其起因就是fetchUserOrder办法是一个异步办法,所以不会立刻返回,从而导致后果打印失败。
将下面的代码用async改写:
Future<String> createOrderMessage() async { var order = await fetchUserOrder(); return 'Your order is: $order';}Future<String> fetchUserOrder() => Future.delayed( const Duration(seconds: 2), () => 'Large Latte', );Future<void> main() async { print('Fetching user order...'); print(await createOrderMessage());}
Future
下面咱们在应用async和await的过程中应用到了Future。在java中Future示意的是线程的执行后果。在dart中Future示意的是一个异步执行的后果。
Future有两种状态:uncompleted 或者 completed。
当最开始执行一个异步函数的时候,会返回一个未实现的Future。这个未实现的Future会等等异步执行的实现或者失败。
不论异步程序是胜利还是失败,最终都会返回一个实现状态。
async返回的Future能够接泛型,示意的时候返回的具体类型,比方Future<String> 示意的是返回一个字符串,而 Future<void>示意不返回任何值。
上面是两个不同返回的例子:
Future<String> fetchUserOrder() { return Future.delayed(const Duration(seconds: 2), () => 'Large Latte');}Future<void> fetchUserOrder() { return Future.delayed(const Duration(seconds: 2), () => print('Large Latte'));}
上面是一个异样的例子:
Future<void> fetchUserOrder() { return Future.delayed(const Duration(seconds: 2), () => throw Exception('Logout failed: user ID is invalid'));}
异步异样解决
在async的函数中,对await的异步办法中抛出的异样,能够间接是用try catch来进行异样的捕捉:
try { print('Awaiting user order...'); var order = await fetchUserOrder();} catch (err) { print('Caught error: $err');}
在同步函数中调用异步函数
下面介绍的fetchUserOrder()返回的是一个Future<String>,示意的是一个异步执行的过程。
那么如果是一个同步的办法,比方main()函数中,如何去调用异步办法,并且失去返回值呢?
await必定是不行的,因为await只能在async的办法中调用。这个时候就能够用到then语句:
fetchUserOrder().then(order=>'do something');
then语句会期待异步执行返回后果,而后对后果进行解决,实际上就等同于javascript中的回调。
总结
以上就是dart中async和await的用法。
本文已收录于 http://www.flydean.com/12-dart-async/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!
欢送关注我的公众号:「程序那些事」,懂技术,更懂你!