异步

Dart 的底层实现跟 JavaScript/Node.js 类似,是单线程且”天生”异步的,而对比 Node.js,Dart 标准库对异步的支持更加全面且统一。

Dart 通过async/await关键字声明异步代码,通过dart:async库的FutureStream表示异步操作。

核心概念

async用于声明异步函数,await用于调用异步函数,且await只能在异步函数中使用。

Future代表一个异步执行的操作(数据),而Stream表示一连串异步操作(数据)。异步操作返回的可能是正常的数据,也可能是错误。

一般情况下,FutureStream只参与异步函数的声明就足够了,只是在某些复杂场景下才需要直接使用它们。

基础用法

async关键字放置于函数体之前,函数就变为异步;在同步函数调用之前添加await即变为异步调用;

  1. // 使用async声明异步函数
  2. // 因为有类型推断,函数返回值可以不写,但不推荐
  3. asyncHello() async {
  4. return 'hello'; // 结果将被封装在Futrue中,即实际返回类型是 Future<String>
  5. }
  6. // 使用await调用异步函数,注意main本身也是异步
  7. main() async {
  8. var t = await asyncHello();
  9. print(t);
  10. }

和同步调用一样,async/await也是使用trycatchfinally进行错误处理

  1. try {
  2. var result = await asyncFn();
  3. } catch (e) {
  4. // 错误处理
  5. }

进阶使用

// TODO: