JS async/await - why does await need async?

前端 未结 2 1036
鱼传尺愫
鱼传尺愫 2020-12-11 16:10

Why does using await need its outer function to be declared async?

For example, why does this mongoose statement need the function it\'s in

相关标签:
2条回答
  • 2020-12-11 16:21

    Copied from https://stackoverflow.com/a/41744179/1483977 by @phaux:

    These answers all give valid arguments for why the async keyword is a good thing, but none of them actually mentions the real reason why it had to be added to the spec.

    The reason is that this was a valid JS pre-ES7

    function await(x) {
      return 'awaiting ' + x
    }
    
    function foo() {
      return(await(42))
    }
    

    According to your logic, would foo() return Promise{42} or "awaiting 42"? (returning a Promise would break backward compatibility)

    So the answer is: await is a regular identifier and it's only treated as a keyword inside async functions, so they have to be marked in some way.

    Fun fact: the original spec proposed more lightweight function^ foo() {} for async syntax.

    0 讨论(0)
  • 2020-12-11 16:22

    I'm not privy to the JavaScript language design discussions, but I assume it's for the same reasons that the C# language requires async (also see my blog).

    Namely:

    1. Backwards compatibility. If await was suddenly a new keyword everywhere, then any existing code using await as a variable name would break. Since await is a contextual keyword (activated by async), only code that intends to use await as a keyword will have await be a keyword.
    2. Easier to parse. async makes asynchronous code easier to parse for transpilers, browsers, tools, and humans.
    0 讨论(0)
提交回复
热议问题