gpt4 book ai didi

node.js - Express 中的回调与等待性能

转载 作者:太空宇宙 更新时间:2023-11-03 21:52:36 27 4
gpt4 key购买 nike

人们说 async/await 只是为 Promise 编写回调的另一种方式。然而,我觉得它们似乎是不可互换的;事实上,在 Express 中回调会更好,因为它会立即将结果返回给用户。这是正确的吗?

在下面的示例中,假设我们不关心 doSomethingAsync() 的结果,但希望立即重定向。在这里,我们使用await

router.get('/register', async (req, res) => {
res.redirect('/')
await doSomethingAsync()
console.log(1)
}

router.get('/', (req, res) => {
console.log(2)
...
}

这将打印出1,然后打印出2,这意味着我们将无法退出/register处理程序并重定向,除非异步函数完成。

在下面的版本中,我们在 then 中使用带有回调的 Promise。

router.get('/register', (req, res) => {
res.redirect('/')
doSomethingAsync().then(() => {
console.log(1)
})
}

router.get('/', (req, res) => {
console.log(2)
...
}

这将打印出2,然后打印出1,这意味着我们可以立即退出并重定向用户。第二种方式不是性能更好吗?或者它们实际上是相同的?

最佳答案

People say that async/await is just another way to write callbacks for promises. However, I feel as though they are not interchangeable;

这是不正确的,它们确实可以互换。事实上,async/await 允许您比使用简单的 Promise 更轻松地做事,因为 await 表达式几乎可以插入到任何控件中无缝地流动逻辑,而您无法通过简单的 Promise 来做到这一点,并且需要使用顺序 .then() 调用来链接它们。

In fact, callbacks would be better in Express because it returns the result to the user right away. Is this correct?

没有。回调是一种不同的异步传递数据的机制;它不是“立即”,也不是明显更快,并且使用 Promise 进行编程的好处远远超过了诉诸 callback hell 的任何可忽略的性能影响。 。另外,你的第二个例子不是真正的回调,它是一个 promise 链。

This would print out 1, then 2, meaning that we won't be able to exit the /register handler and redirect unless the async function finishes.

这是不正确的。 await是非阻塞的。 async function一旦调用 doSomethingAsync() 就返回给调用者,并且 async function's返回值是在调用 console.log(1) 后解析的 promise 。

This would print out 2, then 1, meaning that we can exit immediately and redirect the user. Isn't the second way better for performance? Or are they actually the same?

这两个片段在算法上是相同的,并且由于 console.log(2) 依赖于执行 res.redirect('/') 指示的 HTTP 请求的客户端浏览器。它独立于 doSomethingAsync(),实际上存在竞争条件,并且日志的顺序都无法保证。它的性能也与使用 await 的示例没有什么不同

关于node.js - Express 中的回调与等待性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49688412/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com