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
的参数,您可以做什么。