Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous dart中的异步编程(未来、等待)_Asynchronous_Dart - Fatal编程技术网

Asynchronous dart中的异步编程(未来、等待)

Asynchronous dart中的异步编程(未来、等待),asynchronous,dart,Asynchronous,Dart,我应该对以下代码进行哪些更改以获得以下输出: 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 {

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

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');
}
导入'dart:async';
void main(){
性能测试();
}
void performTasks()异步{
task1();
字符串task2Result=await task2();
task3(task2Result);
任务4();
}
void task1(){
字符串结果='任务1数据';
打印(“任务1完成”);
}
Future task2()异步{
持续时间3秒=持续时间(秒数:3);
字符串结果;
等待未来。延迟(三秒钟,(){
结果='任务2数据';
打印(“任务2完成”);
});
返回结果;
}
void task3(字符串task2Data){
字符串结果='任务3数据';
打印($task2Data完成任务3);
}
void task4(){
字符串结果='任务4数据';
打印(“任务4完成”);
}

performTasks()
中,您应该移动
task4()紧跟在
task1()之后

performTasks()
中,您应该移动
task4()紧跟在
task1()之后等待
task2
后,不要调用
task4
。 因此:

void performtask()异步{
task1();
任务4();
字符串task2Result=await task2();
task3(task2Result);
}
这看起来很明显,所以我假设你真正的问题更复杂,你不能像那样移动
test4()

在这种情况下,不应使用
wait
await
确保在
await
之后写入的所有内容也在等待的未来完成后执行

相反,您可以求助于
Future
API:

void performtask(){//no`async`
task1();
task2().then(task3);//no`wait`
任务4();
}
这将设置运行
task2()
,完成后,调用
task3
,并给出结果。不过,它不等待任何东西,在设置之后会立即执行
task4

期货交易所接受回调,并最终以未来的结果调用回调。这里
task3
接受一个参数,因此它可以直接用作回调

这假设
task2
的结果可以直接用作
task3
的参数。如果没有,您必须首先捕获结果并对其进行操作,您可以按照以下方式进行操作:

void performtask(){//no`async`
task1();
task2()。然后((result2){//这里仍然没有等待!
var argument3=操纵(结果2);
//…还有你想做的任何事
//在任务2完成和任务3启动之间。
任务3(论证3);
});
任务4();
}

等待
task2
后不要调用
task4
。 因此:

void performtask()异步{
task1();
任务4();
字符串task2Result=await task2();
task3(task2Result);
}
这看起来很明显,所以我假设你真正的问题更复杂,你不能像那样移动
test4()

在这种情况下,不应使用
wait
await
确保在
await
之后写入的所有内容也在等待的未来完成后执行

相反,您可以求助于
Future
API:

void performtask(){//no`async`
task1();
task2().then(task3);//no`wait`
任务4();
}
这将设置运行
task2()
,完成后,调用
task3
,并给出结果。不过,它不等待任何东西,在设置之后会立即执行
task4

期货交易所接受回调,并最终以未来的结果调用回调。这里
task3
接受一个参数,因此它可以直接用作回调

这假设
task2
的结果可以直接用作
task3
的参数。如果没有,您必须首先捕获结果并对其进行操作,您可以按照以下方式进行操作:

void performtask(){//no`async`
task1();
task2()。然后((result2){//这里仍然没有等待!
var argument3=操纵(结果2);
//…还有你想做的任何事
//在任务2完成和任务3启动之间。
任务3(论证3);
});
任务4();
}

我想进一步澄清这一变化。在您的代码中,task2()中的“result”变量是如何传递给task3()的(task2()。然后(task3);)此外,假设我从task2()返回两个不同数据类型(result1和result2)的变量,但只将result1传递给task3()。如何执行此操作?此处
task2
返回一个
Future
,因此它只返回一个字符串。
result
变量只是
task2
中的一个局部变量,它唯一能返回的是未来的完成情况。我已经添加了一个示例,说明如果这不是您需要传递给
task3
的参数,您可以做些什么。我想进一步澄清更改。在您的代码中,task2()中的“result”变量是如何传递给task3()的(task2()。然后(task3);)此外,假设我从task2()返回两个不同数据类型(result1和result2)的变量,但只将result1传递给task3()。如何执行此操作?此处
task2
返回一个
Future
,因此它只返回一个字符串。
result
变量只是
task2
中的一个局部变量,它唯一能返回的是未来的完成情况。我已经添加了一个示例,说明如果这不是您需要传递给
task3
的参数,您可以做什么。