【问题标题】:Possible race condition Node/Express可能的竞争条件 Node/Express
【发布时间】:2021-12-06 12:35:15
【问题描述】:

我正在尝试了解我的 Node/Express 应用程序遇到的一个案例。

假设我有以下函数,它是在到达特定路线时调用的函数:

async function routeThatDoesStuff(req, res, next) {
     doAsyncStuff()

     res.status(200).json({ message: 'Completed' })
}

在这种情况下,doAsyncStuff() 对发回给用户的非关键资源进行数据库操作,因此理论上我们不需要await 它。但是,除非我把await放在前面,否则这个操作似乎并没有真正完成。

我的猜测是这与 Node.js 中的事件循环等有关。这可能是因为路由在 doAsyncStuff() 完成之前完成,因此该函数实际上并未完成,因为 Node 提前终止了它。

我最大的问题是,当父函数已经完成时,Node 如何处理异步子函数执行?

【问题讨论】:

  • “看来这个操作实际上并没有完成” - 是什么让你认为没有await关键字异步操作没有完成?
  • @Yousaf 数据库中的资源没有更新
  • 可以分享doAsyncStuff函数里面的代码吗?
  • 你不能阻止 JavaScript 中的异步行为

标签: node.js express async-await


【解决方案1】:

一个证明这应该有效的例子:

const sleep = (milliseconds, cb) => {
    return new Promise(resolve => setTimeout(() => {
        resolve(cb())
    }, milliseconds))
}

async function routeThatDoesStuff(req, res, next) {
    sleep(5000, () => console.log('done'))

    res.status(200).json({ message: 'Completed' })
}

JSON 响应立即显示,即使响应已发送,也会在 5 秒后执行回调。

【讨论】:

    猜你喜欢
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 2019-09-09
    • 1970-01-01
    • 2013-05-06
    • 2019-11-25
    • 1970-01-01
    相关资源
    最近更新 更多