【问题标题】:async/await - not waiting before future() - Dartasync/await - 在 future() 之前不等待 - Dart
【发布时间】:2019-04-14 10:44:49
【问题描述】:

基于 Dart 官方页面 使用Async/Wait时:

当应用看到async这个词时,它会正常同步执行函数,直到它看到awaitreturn

请注意,异步函数会立即开始执行 (同步)。该函数暂停执行并返回一个 未完成的未来,当它到达任何一个的第一次出现时 以下:

  • 函数的第一个等待表达式(在函数获取 该表达式未完成的未来)。
  • 函数中的任何返回语句。
  • 函数体结束。

当它看到它们中的任何一个时,它会返回一个未完成的Future 并停止执行async 函数,直到它执行所有其他函数,当所有其他函数都执行时,应用程序会返回到async 函数并执行其中的内容。

这是 Dart 官方页面的一张照片,详细解释了它:

但是当我测试时,我尝试在返回未来结果之前添加 print 语句,如您在下面的代码中所见,但结果与网站中所述的不同,正如它所说应用程序在看到单词 await 时停止执行,但语句:"Async - Hi Called 1st" 已打印,正如您在执行其他函数之前所看到的那样。 p>

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 ");
  }

输出:

Async - Hi Called 1st
Called 2nd
Called 3rd
Called 4th
Async - Called 1st 

那么为什么会这样呢?我错过了什么吗?

【问题讨论】:

    标签: asynchronous dart async-await flutter


    【解决方案1】:

    应用程序不会停止执行,只是延迟执行await之后的代码,直到返回的Future完成。

    您还需要等待对异步函数print1stAsync()的调用,否则在调用callAsync();之后会继续执行main(在调用之后,而不是在它返回的Future完成之后)

    main() async {
      await print1stAsync();
      print2nd();
      print3rd();
      print4th();
    }
    

    async 添加到函数也意味着该函数返回Future。 没有办法从异步返回到同步。异步具有传染性。

    await callAsync(); 表示同一函数中该行下方的代码(如您的示例中的 print(test);)将被延迟。
    它没有说明 callAsync() 中的代码或调用print1stAsync();的代码

    【讨论】:

    • 在不返回任何值时是否可以使用void 而不是Future&lt;Null&gt; 作为返回类型,因为我的IDE 没有显示任何错误,并且代码在两种情况下都可以正常工作。
    • 是的,没关系。这发出了即发即弃的信号——该函数表明它不会被等待。它很少使用,但它是有效的。
    • 我不确定我是否理解您的问题。 print("Async - Hi Called 1st"); 立即执行。在执行到达该行之前没有await。当 awaited Future in print1stAsync 完成时,从 print1stAsync 返回的 Future 完成。如果没有等待,main 中的代码将继续执行正在等待 printAsync() 中的异步结果。
    • await callAsync(); 表示同一函数中该行下方的代码(如您的示例中的print(test);)将被延迟。它没有说明callAsync() 中的代码或调用print1stAsync 的代码。
    • 我现在完全理解了,这就是神奇的句子“await 没有说明 callAsync() 中的代码”。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2016-03-08
    • 1970-01-01
    • 2020-06-19
    • 2018-12-20
    相关资源
    最近更新 更多