我应该对以下代码进行哪些更改才能获得以下输出:

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()
在这种情况下,您不应使用awaitawait确保在等待的将来完成后,在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/

10-16 20:11
查看更多