node.js - 将节点 api 函数显式声明为异步的含义?
问题描述
给定一个 node express 应用程序,我们可以使用“async”将 api 中的函数声明为 asynchornous。
app.get(/v1/user', async function(request, response) {
response.status(200).send({ message: messageReturn });
});
据我了解,如果您在 api 内的函数上使用 await,这很有用。但是,如果 api 不需要等待任何东西,与不将此函数调用为 相比,是否有任何影响(语法或性能)(如果有)async
?即我可以将每个 api 函数声明为异步而不是
app.get(/v1/user', function(request, response) {
response.status(200).send({ message: messageReturn });
});
解决方案
一个async
函数总是返回一个承诺。
但是,Express 不会关注您传递的处理程序或中间件app.get()
或任何其他路由或中间件注册的返回值。
因此,您可以async
在需要使用它时使用它,以便您可以await
在功能的实现中使用它。但是,Expresss 并没有关注返回的承诺,也不会对它做任何事情。
据我了解,如果您在 api 内的函数上使用 await,这很有用。
是的。而且,这是唯一的理由来声明它async
。
但是,如果 api 不需要等待任何东西,与不将此函数调用为异步相比,是否有任何影响(语法或性能)(如果有)?
可能对性能没有影响,但你强迫解释器做一些额外的开销。它会try/catch
在你的代码周围放置一个 a 并且它会做出一个新的承诺,它与 thetry/catch
和返回值挂钩。由于没有使用该承诺,它只是浪费了解释器的周期,因为它必须为每个请求创建和垃圾收集一个新的承诺对象,并且它还将在解释器内部有一些额外的设置开销来捕获async
函数中的异常(因为异常被async
功能基础设施变成拒绝的承诺)。
我可以将每个 api 函数声明为异步吗
你可以”。但是,我认为你“不应该”。 async
有几个特定的目的。如果您的代码不需要任何这些目的,那么我认为您不应该使用它。
推荐阅读
- oracle - 如何正确处理与 jooq 的连接?
- pmdarima - 我正在使用不再包含 statsmodels ARIMA 或 ARMA 类的 pmdarima 版本。没有 pdq 如何解释 SARIMAX?
- node.js - 即使在 assertExchange 之后,rabbitmq 发布到交换也会抛出 404
- c# - Microsoft 图形 API:使用 userID 查询已在邮箱上为特定用户创建的订阅列表
- docker - 将 Cypress 配置文件包含到 docker-compose 中
- yaml - GitHub Actions yaml 中多行字符串的条件构建
- java - 在Java中将属性插入到List属性中
- python - 在 Windows 中配置一个 python c++ 扩展
- debugging - vscode 调试器配置:cwd
- bash - 从 bash 脚本调用 rosbag 信息