【发布时间】:2017-07-03 22:46:54
【问题描述】:
我目前正在学习 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()。
【问题讨论】:
-
AFAIK 异步和阻塞之间的区别在于,您可以在单个线程中拥有多个异步进程(其中一个可以工作,而其他进程不工作),而阻塞进程会阻塞整个线程。跨度>
-
这个问题的有趣之处在于,从字面上看,实际的答案(在 C# 中)只是 _"
async关键字是必要的,因为await是在后来的开发中引入的语言,并且代码中可能包含用户定义的标识符await;async允许代码选择加入,并防止破坏不支持异步的现有代码。否则,编译器将刚刚自动将包含await的方法变成了异步方法,包含yield的方法是自动考虑的迭代器方法。” -
但这似乎并不是你真正要问的。你真的只是不明白
async/await是如何工作的,也不了解语义是什么。您应该阅读有关该主题的众多现有问答之一。我们真的不需要在 Stack Overflow 上再次对其进行重新散列。 -
您希望您的问题以“过于宽泛”或“主要基于意见”的方式结束?事实上,标记的副本解决了您在涉及 C# 的范围内提出的问题。如果您不想要以 C# 为中心的答案,请不要将 C# 拖入问题中。 Stack Overflow 不是研究比较语言设计的地方,每种语言中的异步功能都不够相似,无法讨论,更不用说回答你的问题,而不会过于宽泛或只是一个见仁见智的问题。
-
这绝对不是重复的,也不是太宽泛或主要基于意见。 This 我会怎么回答这个问题。
标签: javascript asynchronous promise dart