javascript - 为什么 'await' 在函数定义中需要 'async'

标签 javascript asynchronous promise dart

我目前正在学习 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/

    相关文章:

    c# - 一些异步套接字代码 - 帮助垃圾收集?

    javascript - 从 Promise 返回非返回函数导致警告

    javascript - Node.js Q promise forEach 返回未定义

    php - JQuery 数组和输入复选框+隐藏

    javascript - 如何将 ul 和 li 转换为 select 和 options 并保留类?

    c# - 我们如何在 C++/CX 中等待 C# 异步委托(delegate)函数

    javascript - 什么是显式 promise 构造反模式,我该如何避免它?

    javascript - 如何访问backbone.js中的特定 View ?

    javascript - 如何搜索具有多个值的单个单元格

    c++ - 如何等待 Glib::Dispatcher 的连接函数完成?