📅  最后修改于: 2023-12-03 15:28:58.340000             🧑  作者: Mango
飞镖异步流(dart:async)是一种 Dart 语言中关于异步操作的框架。在 Dart 中,所有与外部环境的交互(比如网络请求、文件读写等)都是异步的,可以利用飞镖异步流来方便地进行管理。
利用飞镖异步流,可以使异步代码更加清晰易读,尤其是在处理大量异步操作时,可以让代码的可读性和可维护性都有很大的提升。飞镖异步流还提供了一些类,如 Stream
和 Future
,可以帮助我们更方便地对异步操作进行控制。
以下是一个简单的使用飞镖异步流的示例:
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
可以看到,由于 Future
和 Stream
都是异步操作,所以在输出 end
后并不会立即执行 Future
和 Stream
的回调函数,而是在它们所对应的时间点才进行输出。
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
表示一个异步操作的结果,对应的是 Promise
或 Task
。以下是一个使用 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
分别是 Dart 语言中用来实现异步操作的关键字。其中,async
表示将普通函数标记为异步方法,而 await
表示等待一个异步方法执行完成,并返回该方法的结果。以下是一个演示 async
和 await
的示例:
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
在这个示例中,我们通过 async
和 await
实现了异步逻辑的串联。fetchData
方法返回一个异步结果(即 Future<String>
类型),而 process
方法利用 await
等待 fetchData
方法的执行结果,并在此基础上对数据进行处理,最终返回一个经过处理的字符串结果。在 main
方法中,我们同样利用 await
等待 process
方法的结果,并输出该结果。