Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous 为什么调用异步方法的方法需要异步?_Asynchronous_Dart - Fatal编程技术网

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

Asynchronous 为什么调用异步方法的方法需要异步?,asynchronous,dart,Asynchronous,Dart,考虑以下(教科书)示例dart代码: // Sequential processing using async and await. main() async { await expensiveA(); await expensiveB(); doSomethingWith(await expensiveC()); } 我理解wait将在继续之前等待未来“费用支出”的结果完成 但我不明白的是为什么main()本身必须声明为异步?显然你必须这样做,否则程序将无法编译。但是为什么同步方

考虑以下(教科书)示例dart代码:

// Sequential processing using async and await.
main() async {
  await expensiveA();
  await expensiveB();
  doSomethingWith(await expensiveC());
}
我理解wait将在继续之前等待未来“费用支出”的结果完成

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


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

异步之前
/
等待
,这是刚刚添加到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;
}
异步调用返回一个
未来
,您可以将函数传递给它的
,然后在异步调用完成时调用
方法

此代码

main() async {
  await expensiveA();
  await expensiveB();
  doSomethingWith(await expensiveC()); // doSomethingWith is not awaited
}
get在执行之前被重写为与第一个代码块中的代码类似的代码

这表明
async
/
await
不会改变代码的性质,它只会将语法更改为更像同步代码的内容

async
是一个标记,表示方法中的代码需要重写,此标记允许使用
await
,无需重写
await
将没有任何意义

async
隐式返回最后一个
wait
ed
Future
,以便调用者能够
等待该
Future
的完成。 由于返回的是
未来
,因此强模式要求返回类型匹配。

为什么同步方法不能等待异步调用的结果? 因为这将意味着在昂贵的通话结束之前阻塞


不管Dart是怎样的,所以用简单的方法阻止整个Dart应用程序将是极其危险的。

因此,在方法上使用async基本上是对编译器的一个提示,它必须重写Wait方法才能使用Futures。我想我理解了,但这有点混乱,也不太合乎逻辑,如果方法a想要调用并等待异步方法B返回,那么a必须突然也是异步的,所有其他调用a的人都会因此而受到影响。如果编译器能够理解正在发生的事情,而不是这种“预处理器”方法,那就更好了。异步在一开始对许多人来说是相当混乱的。有很多很多类似的问题(也适用于其他语言)。异步执行具有传染性。无法返回同步执行。如果您不想等待呼叫方站点上的呼叫,则无需添加
async
。异步执行对API有严重影响,您需要仔细考虑如何设计代码。在我看来,在很多情况下,将其隐式化也会让人感到困惑。但dart似乎让人更加困惑。如果一个方法等待其所有内部异步方法调用,那么该方法也必须是异步的原因是什么?由于上次异步调用已经完成,因此该方法本身将立即完成。这与同步调用没有区别。然而,该方法周围的所有代码现在也必须等待,并且您不能在某些情况下使用该方法(例如在颤振设置状态(fn)函数中)。没有真正好的逻辑原因。要等待任何事情,它必须是异步的。这不是特定于省道的。异步执行在其他语言中看起来非常相似(也有
asnyc
/
await
,否则就有
。然后(…)
或其他类似的语言)。如果您查看答案中的第一个代码块,您将看到异步执行是关于传递函数的,当事件发生时,接收器会调用这些函数(例如函数
(\u)=>wait expensiveB()
传递给
。然后(…)
.Async执行不仅仅是一些奇怪的Dart行为。我认为他们能够让它变得如此舒适真是太好了。main()需要异步的原因是因为它太复杂了,编译器无法判断main()是否它确实在等待它所有的异步调用。如果它能弄明白这一点,那么它就会意识到“wait main()”将始终是不可操作的。这不对吗?我的意思是我遗漏了等待的含义吗?但我想阻止。我需要昂贵调用的结果。是的,您需要结果,然后才能在调用函数的代码中继续-这正是等待构造将提供给您的内容。您通常不希望以系统停止到r的方式阻止Respond.Caller函数在到达Wait时挂起,系统允许异步昂贵函数执行,然后在完成后恢复调用函数。请注意,昂贵函数通常等待网络、磁盘等,系统有足够的时间处理其他请求并保持响应。执行“等待费用a()"是异步的,必须如@lm所解释的那样。我创建了一个小演示,您可以在dartpad中运行,并从调试打印中查看执行顺序:Dart中的所有函数在被调用时都会同步返回。异步函数只是同步返回未来的函数。如果您的函数包含一个
wait
,那么它必须等待该操作完成,然后再执行正文的其余部分,包括返回语句。具有
await
意味着返回不是同步执行的,因此函数需要返回
Future
,相反,它还不知道返回哪个值。这就是为什么
await
仅在
async中允许的原因函数-它们是唯一可以延迟返回语句的函数。