为什么调用异步方法的方法需要异步?

use*_*068 4 asynchronous dart

考虑这个(教科书)样本飞镖码:

// Sequential processing using async and await.
main() async {
  await expensiveA();
  await expensiveB();
  doSomethingWith(await expensiveC());
}
Run Code Online (Sandbox Code Playgroud)

我知道await将等待未来"昂贵的A"的结果在继续之前完成.

但我不明白为什么main()本身必须声明为异步?显然你必须这样做,否则程序将无法编译.但为什么同步方法不能等待异步调用的结果呢?

我知道这一定是一个新手问题,但我还没有找到答案.

Gün*_*uer 5

之前async/ await,这只是前一段时间才添加到Dart,你会写得像

main() {
  var result = expensiveA()
    .then((_) => expensiveB())
    .then((_) => expensiveC()); // the Future returned by expensiveC will be returned because `doSomethingWith` is not awaited in your code
  result.then(doSomethingWith);
  return result;
}
Run Code Online (Sandbox Code Playgroud)

异步调用返回a Future,您可以将函数传递给它then在异步调用完成时调用的方法.

这段代码

main() async {
  await expensiveA();
  await expensiveB();
  doSomethingWith(await expensiveC()); // doSomethingWith is not awaited
}
Run Code Online (Sandbox Code Playgroud)

在执行之前,将get重写为与第一个代码块中的代码类似的内容.

这表明async/ await不会改变代码的性质,它只会将语法更改为看起来更像同步代码的东西.

async是一个标记,该方法中的代码需要重写,并且这个标记允许使用await,而不重写await将没有任何意义.

async隐式返回最后一个awaited Future,以便调用者能够await完成此操作Future.因为Future返回了a ,所以强模式要求返回类型匹配.