乐趣区

关于dart:dart系列之dart中的异步编程

简介

相熟 javascript 的敌人应该晓得,在 ES6 中引入了 await 和 async 的语法,能够不便的进行异步编程, 从而解脱了回调天堂。dart 作为一种新生的语言,没有理由不继承这种优良的品质。很天然的,dart 中也有 await 和 async 语言,一起来看看吧。

为什么要用异步编程

那么为什么要用异步编程呢?只用同步不可能解决吗?

其实大多状况下同步曾经够用了,然而在上面的几种状况下,同步的场景还是有缺点的。

  1. 须要花很长时间从网络上下载数据的状况。
  2. 读取数据库的耗时状况。
  3. 从文件读取数据的状况。

总结而言,如果某些操作须要破费大量的工夫,那么就能够用到异步编程了。

怎么应用

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/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

欢送关注我的公众号:「程序那些事」, 懂技术,更懂你!

退出移动版