Asynchronous 异步/等待-在future()之前不等待-Dart
使用时基于Dart官方页面: 当应用程序看到单词Asynchronous 异步/等待-在future()之前不等待-Dart,asynchronous,dart,async-await,flutter,Asynchronous,Dart,Async Await,Flutter,使用时基于Dart官方页面: 当应用程序看到单词async时,它会正常同步执行函数,直到看到wait或return 请注意,异步函数立即开始执行 (同步地)。函数暂停执行并返回 未完成的未来,当它达到任何 以下: 函数的第一个等待表达式(在函数获取 未完成的未来(来自该表达式) 函数中的任何返回语句 函数体的末尾 当它看到它们中的任何一个时,它返回一个未完成的Future,并停止执行async函数,直到它执行所有其他函数,当所有其他函数都执行时,应用程序返回到async函数并执行其中的内容
async
时,它会正常同步执行函数,直到看到wait
或return
请注意,异步函数立即开始执行
(同步地)。函数暂停执行并返回
未完成的未来,当它达到任何
以下:
- 函数的第一个等待表达式(在函数获取 未完成的未来(来自该表达式)李>
- 函数中的任何返回语句李>
- 函数体的末尾
Future
,并停止执行async
函数,直到它执行所有其他函数,当所有其他函数都执行时,应用程序返回到async
函数并执行其中的内容
下面是Dart官方页面上的一张照片,详细解释了这一点:但当我测试时,我试图在返回未来结果之前添加一条
打印
语句,正如您在下面的代码中看到的,但结果与网站中所述不同,因为它说应用程序在看到单词wait
时停止执行,但语句是:“Async-Hi Called 1st”如您所见,在执行其他功能之前已打印。
import 'dart:async';
Future<void> print1stAsync() async {
var test = await callAsync();
print(test);
}
main() {
print1stAsync();
print2nd();
print3rd();
print4th();
}
print2nd() {
print('Called 2nd');
}
print3rd() {
print("Called 3rd");
}
print4th() {
print('Called 4th');
}
Future<String> callAsync() {
print("Async - Hi Called 1st");
return Future(() => "Async - Called 1st ");
}
那么为什么会发生这种情况呢?我没有理解什么吗?应用程序没有停止执行,只有
wait
之后的代码执行被延迟,直到返回的Future
完成
您还需要等待对异步函数的调用print1stAsync()
,否则main
的执行将在调用callAsync()后继续进行代码>(在调用之后,而不是在它返回的将来的完成之后)
将async
添加到函数也意味着该函数返回未来的。
无法从异步返回到同步。异步是有传染性的
wait callAsync()代码>表示同一函数中该行下方的代码(如示例中的打印(测试);
)将被延迟。
它没有说明callAsync()中的代码或调用Print1StatSync()的代码代码>当不返回任何值时,是否可以使用void
作为返回类型,而不是Future
,因为我的IDE没有显示任何错误,并且代码在这两种情况下都工作相同。是的,可以。这表示触发并忘记-该函数表示不希望等待它。它很少使用,但它是有效的。我不确定我是否理解你的问题<代码>打印(“异步-Hi称为第一”)代码>立即执行。在执行到达该行之前,不存在等待。当print1stAsync
中的每个wait
edFuture
完成时,从print1stAsync
返回的Future
将完成。如果未等待,则main
中的代码将继续执行等待printAsync()
中的异步结果。await callAsync()
表示同一函数中该行下方的代码(如示例中的打印(测试);
)将被延迟。它没有提到callAsync()
中的代码,也没有提到调用print1stAsync
的代码。我现在完全理解了它,这就是神奇的句子“wait没有提到callAsync()中的代码”。非常感谢你。
Async - Hi Called 1st
Called 2nd
Called 3rd
Called 4th
Async - Called 1st
main() async {
await print1stAsync();
print2nd();
print3rd();
print4th();
}