【问题标题】:Why does Javascript (ES.next) force me to declare a function as async if I want to use await?如果我想使用 await,为什么 Javascript (ES.next) 强制我将函数声明为异步?
【发布时间】:2016-06-11 01:17:26
【问题描述】:

似乎编译器/解析器应该足够聪明,可以检测函数是否使用await,然后它会自动变成async 函数。

为什么我必须输入async 关键字?它增加了混乱,很多时候我忘记添加它,我得到一个错误,然后我必须去添加它。

让编译器在看到await 时自动将函数提升为async 并省去大家处理它的麻烦会有什么缺点吗?

【问题讨论】:

  • 您有时忘记添加它的事实应该是足够的理由。如果您正在编写代码而忘记添加它,那么其他人还有什么希望弄清楚发生了什么?
  • 谢谢。为了更具体,我在标题中添加了 ES7。虽然不是 Javascript 本身的要求,但我认为几乎每个主要的 Javascript 实现最终都会编译为本机代码。至少对于热门的部分。
  • 如果没有明确定义异步函数,读者怎么会发现它是异步的?您不希望读者阅读函数的所有主体来找到“等待”以确保它是异步的。
  • ES7 已经完成。 async/await 不是 ES7 的一部分。

标签: javascript async-await language-design


【解决方案1】:

将异步函数与 ES6 生成器函数进行比较,很明显:

function* x() {} // Generator function without 'yield'
Object.getPrototypeOf(x); // returns GeneratorFunction

生成器函数在本质上与传统函数不同,但它们的主体中不需要有yield 表达式。实际上有a bug in the ES6 proposal表示如果生成器函数不包含yield是语法错误,但很快就修复了:

一个重要的用例是使用虚拟生成器进行原型设计。或者 注释掉用于调试的产量的情况。那不应该 使程序非法。

同样适用于异步函数:根据the draft,异步函数不需要在其主体中包含awaits,同时仍具有与传统函数不同的行为。

假设您评论了await。然后解释器是否应该将您的异步函数解析为传统函数并可能破坏您的整个代码?最好不要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 2016-05-20
    相关资源
    最近更新 更多