我应该对以下代码进行哪些更改才能获得以下输出:
Task 1 complete
Task 4 complete
Task 2 complete
Task 3 complete with task 2 data
我目前得到下面给出的输出:任务1完成
任务2完成
任务3完成任务2的数据
任务4完成
import 'dart:async';
void main() {
performTasks();
}
void performTasks() async {
task1();
String task2Result = await task2();
task3(task2Result);
task4();
}
void task1() {
String result = 'task 1 data';
print('Task 1 complete');
}
Future<String> task2() async {
Duration threeSeconds = Duration(seconds: 3);
String result;
await Future.delayed(threeSeconds, () {
result = 'task 2 data';
print('Task 2 complete');
});
return result;
}
void task3(String task2Data) {
String result = 'task 3 data';
print('Task 3 complete with $task2Data');
}
void task4() {
String result = 'task 4 data';
print('Task 4 complete');
}
最佳答案
等待task4
后不要调用task2
。
所以:
void performTasks() async {
task1();
task4();
String task2Result = await task2();
task3(task2Result);
}
这看起来很明显,所以我假设您的实际问题更加复杂,并且您不能像这样移动test4()
。在这种情况下,您不应使用
await
。 await
确保在等待的将来完成后,在await
之后编写的所有内容也可以执行。相反,您可以依靠
Future
API:void performTasks() { // no `async`
task1();
task2().then(task3); // no `await`
task4();
}
这将设置task2()
运行,完成后,它将调用task3
及其结果。但是,它不等待任何内容,并且在设置后立即执行task4
。期货上的
then
method进行回调,并最终以Future的结果进行调用。这里task3
接受一个参数,因此可以直接用作该回调。假定
task2
的结果可直接用作task3
的参数。如果不是,则必须捕获结果并首先对其进行操作,您可以按照以下步骤进行操作:void performTasks() { // no `async`
task1();
task2().then((result2) { // still no await here!
var argument3 = manipulate(result2);
// ... and whatever else you want to do
// between task2 completing and task3 starting.
task3(argument3);
});
task4();
}
关于asynchronous - dart中的异步编程( future ,正在等待),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62792414/