【问题标题】:NodeJs Async await by defaultNodeJs 默认异步等待
【发布时间】:2019-08-08 13:48:17
【问题描述】:

在具有异步等待语法的 nodejs Express Web 应用程序上拥有所有功能可能是一种不好的做法吗? (即使他们不一定使用 await 方法)例如:

app.get(basePath, async function (req, res, next) { 
    await anyMethod().then(function () {
    })
    await anyMethod2().then(function () {
    })
});

app.get(basePath, async function (req, res, next) { 
    anyMethod().then(function () {
    })
});

我们的想法是始终将模板定义为异步,或者如果我需要像其他示例一样使用它们以获得最佳实践:

app.get(basePath, async function (req, res, next) { 
    await anyMethod().then(function () {
    })
    await anyMethod2().then(function () {
    })
});

app.get(basePath, function (req, res, next) { 
    anyMethod().then(function () {
    })
});

会影响性能吗?

(我删除了参数和承诺的逻辑以便于问题的可视化)

【问题讨论】:

  • 为什么它们都有空的 then 回调?如果有任何返回值,您将无法使用它。
  • 您好,仅用于将代码减少到最少(为了便于可视化,我删除了参数)
  • 如果调用从不阻塞,则没有必要使其异步或承诺。甚至降低代码的可读性。如果你拒绝知道哪部分代码被阻塞了,你最终会倾向于编写糟糕的代码并在遇到相关错误时遇到麻烦。
  • 是的,这并不是真正必要的,但通常我的 app.get 请求中的大部分都会承诺从模型中获取数据(使用异步方法),并且为了快速开发,我有一个基本的模板系统,其中包含所有funcionalityy(JWT、安全、数据库访问等)。实际上,我在我的模板系统生成的大多数函数中都添加了“异步”字样。所以我认为始终使用“异步”这个词可能是个好主意,但我不知道这是否真的是个好主意
  • 这完全取决于你的函数做什么。你不能站在一边说它是最好的方法并且适合所有类型的场景。 @RickyMo 更详细地解释了。 对于您的模板,您可以不使用async/await,因为开发人员只会在需要该阻塞功能的结果时添加它。

标签: node.js async-await


【解决方案1】:

会影响性能吗?

async/await 总是影响性能。

如果在同步函数中添加async,性能会下降 400%。 A simple banchmark

在 Node.js await 在低级别创建 2 个 Promise,一个然后包装上层代码,另一个用于下一个字面量。 使用 Node.js 12 await 只会产生一个额外的 Promise。

v8 和 Node.js 正在努力减少这种对性能的影响。 V8 Article 解释了 async/await 的工作原理。

相反,看看你的例子,它并不好,因为你什么都没有等待:

await anyMethod2().then(function () { res.reply('hello') })

如果您不使用await 的结果,那将毫无意义,因为最终输出将是相同

await anyMethod2().then(function () { res.reply('hello') })


anyMethod2().then(function () { res.reply('hello') })

这两个句子产生相同的结果,但开销不同(和错误管理)。

您必须考虑anyMethod1()anyMethod2() 可以是并行的还是串行的。在您的示例中,您失去了并行性。

这是值得的:

const res = await anyMethod2().then(function () { return {hi:'world'} })
res.reply(res)

如果您await,请使用输出!

【讨论】:

  • 好的,我明白了,所以我只会在必要时使用异步。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-20
  • 2018-02-08
  • 2020-03-31
  • 2019-06-30
  • 1970-01-01
  • 2021-05-25
相关资源
最近更新 更多