【问题标题】:What does `async` mean in JavaScript when it is *not* followed by `function`?当 JavaScript *not* 后跟 `function` 时,`async` 是什么意思?
【发布时间】:2021-11-30 11:07:41
【问题描述】:

我在使用 fastify 时偶然发现了这段代码 sn-p。

module.exports = async function (fastify, opts) {
  fastify.register(proxy, {
    upstream: 'htt‌ps://news.ycombinator.com/',
    async preHandler(request, reply) {
      if (request.query.token !== 'abc') {
        throw fastify.httpErrors.unauthorized();
      }
    },
  });
};

看起来它用两个参数调用fastify.register,第二个参数是一个对象。第一个字段是upstream,但我不知道接下来会发生什么。 async preHandler(request, reply)...之后的这个语法是什么?

【问题讨论】:

  • 这是一种方法。 async 表示它是一个异步方法体,所以它总是返回一个 promise 并启用 await 的使用。
  • 这只是一种方法。与{ preHandler: async function(request, reply) { ... } } - Method definitions - JavaScript | MDN 相同
  • @VLAZ 我正在查看 ECMAScript 语法规则,这些规则似乎需要 async function 或 async $methodName - 我不认为 async $functionName 是允许的。
  • 您错过了 preHandler 在对象中。隐含的函数也是如此。 {async preHandler() {}}
  • @Dai 这是一个简写的方法符号{foo: function() {} } == {foo() {} } 它几乎相同。不能使用new 调用速记方法,否则与function() {} 工作方式相同

标签: javascript node.js async-await fastify


【解决方案1】:

fastify.register 似乎有这个签名:fastify.register(proxy, {});。所以第二个参数是一个object。

作为stated in MDN 和Andreas in comments,您可以拥有一个包含方法签名的对象。所以你的对象可以声明为:

{
   upstream: string,
   preHandler(request, reply){}
}

preHandler(request, reply){}本质上是preHandler: function(request, reply){}的简写

然后您可以将此方法签名声明为异步(同样为stated in docs)。结果是:

{
   async preHandler(request, reply){}
}

上面也可以声明为:

{
   preHandler: async function(request, reply){}
}

【讨论】:

    猜你喜欢
    • 2020-06-26
    • 2020-04-29
    • 2017-02-27
    • 2012-03-05
    • 2015-10-06
    • 2011-02-25
    • 2012-08-31
    • 2012-01-23
    相关资源
    最近更新 更多