面试题答案
一键面试- 使用
Future
优化异步任务依赖关系- 思路:利用
Future
的then
方法和Future.wait
方法来处理任务的先后顺序和并行执行。then
方法用于在一个Future
完成后执行下一个任务,Future.wait
方法用于等待多个Future
都完成。 - 代码实现:
- 思路:利用
import 'dart:async';
Future<void> taskA() async {
// 模拟任务A的异步操作,例如网络请求或数据库查询
await Future.delayed(const Duration(seconds: 2), () => print('Task A completed'));
}
Future<void> taskB() async {
await Future.delayed(const Duration(seconds: 1), () => print('Task B completed'));
}
Future<void> taskC() async {
await Future.delayed(const Duration(seconds: 1), () => print('Task C completed'));
}
Future<void> taskD() async {
await Future.delayed(const Duration(seconds: 1), () => print('Task D completed'));
}
void main() async {
// 执行任务A
await taskA();
// 任务B和任务C并行执行
List<Future<void>> tasksBC = [taskB(), taskC()];
await Future.wait(tasksBC);
// 任务B和任务C都完成后执行任务D
await taskD();
}
- 使用
Stream
的情况(相对复杂但在某些场景更合适,如持续监听任务状态变化)- 思路:通过
StreamController
创建Stream
,在任务完成时向Stream
中添加数据,通过StreamSubscription
监听Stream
来触发后续任务。 - 代码实现:
- 思路:通过
import 'dart:async';
StreamController<int> streamControllerA = StreamController<int>();
StreamController<int> streamControllerB = StreamController<int>();
StreamController<int> streamControllerC = StreamController<int>();
StreamController<int> streamControllerD = StreamController<int>();
Future<void> taskA() async {
await Future.delayed(const Duration(seconds: 2), () {
print('Task A completed');
streamControllerA.add(1);
});
}
Future<void> taskB() async {
await streamControllerA.stream.first;
await Future.delayed(const Duration(seconds: 1), () {
print('Task B completed');
streamControllerB.add(1);
});
}
Future<void> taskC() async {
await streamControllerA.stream.first;
await Future.delayed(const Duration(seconds: 1), () {
print('Task C completed');
streamControllerC.add(1);
});
}
Future<void> taskD() async {
await Future.wait([streamControllerB.stream.first, streamControllerC.stream.first]);
await Future.delayed(const Duration(seconds: 1), () {
print('Task D completed');
streamControllerD.add(1);
});
}
void main() async {
// 启动任务A
taskA();
// 启动任务B和任务C
taskB();
taskC();
// 启动任务D
taskD();
// 关闭所有StreamController
streamControllerA.close();
streamControllerB.close();
streamControllerC.close();
streamControllerD.close();
}
在实际复杂项目中,Future
方式通常更简洁且易于理解和维护,而Stream
方式更适合需要持续监听任务状态变化或有更复杂事件驱动需求的场景。