我目前正在学习 Dart,但这也适用于 JavaScript 世界中正在发生的事情,而且似乎 C# 也使用相同的模式。
在 Dart 中,任何使用 await
的函数必须通过 async
将自身标记为异步如下:
import "dart:html";
main() async {
var context = querySelector("canvas").context2D;
var running = true;
while (running) {
var time = await window.animationFrame;
...
}
}
这对我来说没有意义。如果一个函数正在等待异步函数完成,那么它是否不被视为阻塞?为什么 JS 和 Dart 都要求标为异步?会不会适得其反?
对我来说,如果调用函数必须使用
async
会更有意义。关键字,如果它调用任何在其定义中也包含它的函数。在这种模式中,await
将用于将异步函数转换为同步函数。这种方式也可以避免重复的功能,因为现在,图书馆似乎总是有
func()
和 funcSync()
或 funcAsync()
.
最佳答案
async
的基本语义/await
在 F#、VB、C#、Python、Dart、Hack 和 JavaScript 中都是相同的。所以我认为这个问题有足够的其他语言的答案。但自从它重新开放...
If a function is waiting on an asynchronous function to complete, is it not then considered blocking?
不。这样想:
在异步方法/函数中,方法/函数可以在
await
处暂停。点,但它在暂停时不会阻塞调用线程。该函数串行运行(一次一条语句),但异步运行(不阻塞调用线程)。To me it would make far more sense if the calling function must use the async keyword if it calls any function that also includes it in its definition.
这就是它已经工作的方式...
await
使用 promise/future/task-returning 方法/函数,以及 async
将方法/函数标记为能够使用 await
.This way would also avoid duplicate functions
这对于历史上阻塞的命令式语言是不可能的。方法/函数要么阻塞调用线程直到它完成,要么不阻塞。它可以是同步的,也可以是异步的。
不过,异步方法/函数有一些有趣的替代方法:
Go 在历史上没有阻塞;您可以将其视为一种语言,其中每个方法/函数都可能是异步的;在任何其他运行时执行此操作将是灾难性的,但 Go 通过实现具有消息传递的严格 goroutine 系统来避免这些问题 - 不允许共享内存或线程。
另一个例子是纯函数式语言,Future 只是另一个 monad,不需要对
async
的特殊编译器支持。/await
关键词。
关于javascript - 为什么 'await' 在函数定义中需要 'async',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44894691/