回调与等待Express中的性能

时间:2018-04-06 08:20:39

标签: node.js express asynchronous web callback

人们说async/await只是为承诺编写回调的另一种方式。但是,我觉得它们似乎不可互换;事实上,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中使用带有回调的承诺。

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

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

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

1 个答案:

答案 0 :(得分:2)

  

人们说async/await只是为承诺编写回调的另一种方式。但是,我觉得它们似乎不可互换;

这是不正确的,它们确实是可以互换的。实际上,async/await允许您比使用普通承诺更容易做事,因为await表达式可以无缝地插入到几乎任何控制流逻辑中,而您却无法做到所以使用简单的承诺,并且需要使用顺序.then()调用来链接它们。

  

事实上,Express中的回调会更好,因为它会立即将结果返回给用户。这是对的吗?

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

  

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

这是不正确的。 await是非阻止的。调用doSomethingAsync()后,async function会返回调用方,async function's返回值是在调用console.log(1)后解析的承诺。

  

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

这两个代码段在算法上是相同的,因为console.log(2)依赖于客户端的浏览器执行res.redirect('/')指示的独立于doSomethingAsync()的HTTP请求,所以实际上你有一个竞争条件,并且不保证日志的顺序。与使用await的示例相比,它的性能没有区别