📜  飞镖异步流 (1)

📅  最后修改于: 2023-12-03 15:28:58.340000             🧑  作者: Mango

飞镖异步流

飞镖异步流(dart:async)是一种 Dart 语言中关于异步操作的框架。在 Dart 中,所有与外部环境的交互(比如网络请求、文件读写等)都是异步的,可以利用飞镖异步流来方便地进行管理。

为什么要使用飞镖异步流

利用飞镖异步流,可以使异步代码更加清晰易读,尤其是在处理大量异步操作时,可以让代码的可读性和可维护性都有很大的提升。飞镖异步流还提供了一些类,如 StreamFuture,可以帮助我们更方便地对异步操作进行控制。

基本使用

以下是一个简单的使用飞镖异步流的示例:

import 'dart:async';

void main() {
  print('start');

  // 使用 `Future.delayed` 创建一个 `Future`,等待 3 秒后输出结果
  Future.delayed(Duration(seconds: 3), () {
    print('future 1 done');
  });

  // 使用 `Stream.periodic` 创建一个周期性的 `Stream`,输出 10 个随机数
  Stream.periodic(Duration(seconds: 1)).take(10).listen((event) {
    print('stream value: $event');
  });

  print('end');
}

输出结果如下:

start
end
stream value: 0
stream value: 1
future 1 done
stream value: 2
stream value: 3
stream value: 4
stream value: 5
stream value: 6
stream value: 7
stream value: 8
stream value: 9

可以看到,由于 FutureStream 都是异步操作,所以在输出 end 后并不会立即执行 FutureStream 的回调函数,而是在它们所对应的时间点才进行输出。

Stream 和 StreamController

Stream 是一种数据流(或者理解为数据序列),在使用时需要通过 StreamController 创建。以下是一个使用 Stream 的示例:

import 'dart:async';

void main() {
  final controller = StreamController<int>();

  controller.stream.listen((event) {
    print('listen: $event');
  });

  controller.add(1);
  controller.add(2);
  controller.add(3);

  controller.close();
}

输出结果如下:

listen: 1
listen: 2
listen: 3

在这个示例中,我们利用 StreamController 创建了一个 Stream,然后在 Stream 上注册了一个 listen 的回调函数,随后依次向 Stream 中添加数值并调用 close 方法,从而结束了该 Stream 的生命周期。

Future

Future 表示一个异步操作的结果,对应的是 PromiseTask。以下是一个使用 Future 的示例:

import 'dart:async';

Future<String> fetchData() async {
  await Future.delayed(Duration(seconds: 2));
  return 'data';
}

void main() async {
  print('start');

  final result = await fetchData();
  print('result: $result');

  print('end');
}

输出结果如下:

start
result: data
end

在这个示例中,我们利用 await 关键字等待 fetchData 方法的执行结果,并输出了 result 变量的值,这样可以让异步逻辑看起来像同步代码一样流畅。

async 和 await

asyncawait 分别是 Dart 语言中用来实现异步操作的关键字。其中,async 表示将普通函数标记为异步方法,而 await 表示等待一个异步方法执行完成,并返回该方法的结果。以下是一个演示 asyncawait 的示例:

import 'dart:async';

Future<String> fetchData() async {
  await Future.delayed(Duration(seconds: 2));
  return 'data';
}

Future<String> process() async {
  final data = await fetchData();
  final processedData = 'processed: $data';
  return processedData;
}

void main() async {
  print('start');

  final result = await process();
  print('result: $result');

  print('end');
}

输出结果如下:

start
result: processed: data
end

在这个示例中,我们通过 asyncawait 实现了异步逻辑的串联。fetchData 方法返回一个异步结果(即 Future<String> 类型),而 process 方法利用 await 等待 fetchData 方法的执行结果,并在此基础上对数据进行处理,最终返回一个经过处理的字符串结果。在 main 方法中,我们同样利用 await 等待 process 方法的结果,并输出该结果。