默认情况下,NodeJs Async等待

时间:2019-03-18 08:26:05

标签: node.js async-await

在具有异步等待语法的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 () {
    })
});

会影响性能吗?

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

1 个答案:

答案 0 :(得分:1)

  

会影响性能吗?

async/await总是会影响性能。

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

在Node.js中添加await <= 11在底层创建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,请使用输出!