如果我想按顺序执行所有操作,在函数内部,我是否等待每一行?

Dan*_*Dan 1 dart

我知道我的大脑在async/await上并不完全清楚所以我需要一些清晰度.我看到很多例子在某些行上使用了await而在标记为异步的函数中没有使用其他行.例如,我很少见过像这样的例子(我使用print语句作为简单/基本的例子.):

myFunction() async {
  await functionA();
  await print("This really long thing that's going to print out.");
  await functionB();
  await MyExtraClass.lookupSomethingQuickly();
  ...
}
Run Code Online (Sandbox Code Playgroud)

所以我看到它的例子通常是这样的:

myFunction() async {
  await functionA();
  print("This really long thing that's going to print out.");
  await functionB();
  MyExtraClass.lookupSomethingQuickly();
  ...
}
Run Code Online (Sandbox Code Playgroud)

所以我想知道是否只是假设简单的事情会按顺序完成,或者理论上,等待在每一行的前面是我应该做的事情,我绝对需要第1行跟随第2行跟随第3行,等...如果我绝对需要在functionB()关闭之前完成打印?

基本上我发现自己每次使用async/await编写一个函数时都会在每一行上进行判断调用,而且我从来不知道我的代码是否正常工作,因为时机和运气都很好,或者是否会出现会导致执行失败的情况.

Gün*_*uer 5

async/ await是使asynchronuos代码更容易编写,阅读和推理.Synchronuos代码不需要这样的支持.
有关Dart中的异步编程,请参阅https://www.dartlang.org/docs/tutorials/futures/

如果你采用这个代码示例

import 'dart:async' show Future;
void main() {
  doSomethingAsync().then((_) => print('afterwards'));
  print('at last');
}

Future doSomethingAsync() {
  return new Future.delayed(const Duration(seconds: 1), () {
    print('done something');
  });
}
Run Code Online (Sandbox Code Playgroud)

DartPad中尝试一下

打印

最后
做了一件
事后

如果您不熟悉异步执行,这可能会令人惊讶

这是因为传递给的代码以Future.delayed()1秒的延迟执行.执行代码时Future,doSomethingAsync()"完成" 返回的实例Future.delayed().

在这一行

doSomethingAsync().then((_) => print('afterwards'));
Run Code Online (Sandbox Code Playgroud)

我们呼吁.then(...)Future返回的doSomethingAsync(),并通过封闭(内嵌功能).then(...).((_) => print('afterwards')).

一个特点Future是它调用then(...)完成后传递给的代码(在我们的情况下,done something在1秒延迟后打印).

所以执行就像是

  • 调用doSomethingAsync()调度print('done something)以便以后执行并返回aFuture
  • print('at last');打印的电话at last
  • print('done something')呼叫1秒延迟后
  • Future从返回doSomethingAsync()完成
  • Future呼叫`(_)=>打印( '事后')
  • main() 结束.

当我们使用async/ await代码看起来像

import 'dart:async' show Future;
Future main() async {
  await doSomethingAsync();
  print('afterwards');
  print('at last');
}

Future doSomethingAsync() {
  return new Future.delayed(const Duration(seconds: 1), () {
    print('done something');
  });
}
Run Code Online (Sandbox Code Playgroud)

DartPad中尝试一下

运行时,输出为

做了一件
事后
在最后

我们也可以使用async/ awaitin,doSomethingAsync()但现在我们只专注于main()

现在执行看起来像

  • 调用doSomething()并等待返回Future完成
  • print('done something')执行Future完毕
  • await继续执行代码
  • print('afterwards');
  • print('at last');

这可能是您期望的行为.

对你原来的问题.await仅在调用返回a时才需要,Future并且您希望以下代码仅在Future完成时执行.如果呼叫没有返回Future,则没有什么可以等待的.

await print('xxx')仍然是有效的代码.这是为了支持有时会执行某些异步工作并返回a的函数,Future但有时候没有异步工作要做,并立即执行代码,然后返回.在这种情况下,没有什么可以等待的.

someTimesAsync() {
  if(new DateTime.now().weekday == 1) {
    return new Future.delayed(const Duration(seconds: 1), () {
      print('done something');
    });
  } else {
    print('done something');
  }
}
Run Code Online (Sandbox Code Playgroud)
await someTimesAsync();
Run Code Online (Sandbox Code Playgroud)

适用于这两种情况.如果不这样做会很麻烦.

为更多细节async/ await又见https://www.dartlang.org/articles/await-async/