javascript - await async - ESLint 中的竞争条件错误 require-atomic-updates

标签 javascript async-await eslint race-condition

下面的代码在使用 ESLint 检查时会导致竞争条件:

  let match = false

  try {
    match = await something()
  } catch (err) {
    // do something
  }
  if (match === false) {
    // do something
  }

编写这段代码的更好方法是什么?

编辑:

  let request = ctx.request.body || {}
  let password = request.password
  let match = false

  try {
    match = await bcrypt.compare(password, 'xxxxx')
  } catch (err) {
    ctx.throw(401, err)
  }
  if (match === false) {
    ctx.throw(401, 'invalid password')
  }

  ctx.body = {
    message: 'logged in ok'
  }

来自 ESLint 的错误:

Possible race condition: ctx.body might be reassigned based on an outdated value of ctx.body require-atomic-updates

最佳答案

您可以安全地忽略警告:)

ESLint 旨在捕捉这样的事情:

 let value = 0;

async function race() {
  value += await Promise.resolve(1);
  console.log(value);
}

race(); race();

在这种情况下,race memoizes value 在堆栈上,await 一个 tick,然后写回 value。当其他代码同时运行时,value 可能已更改,然后更新可能会关闭……这不是原子的。

然而,在您的情况下,您从 ctx.request.body 读取并写入 ctx.body,因此没有非原子更新。此外,可能没有其他中间件同时访问相同的 ctx,因此不可能有任何并发​​修改。因此,在您的情况下,这是一个误报,甚至怀疑这在任何方面都是积极的(它可能是 ESLint 中的错误)。

关于javascript - await async - ESLint 中的竞争条件错误 require-atomic-updates,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56892964/

相关文章:

node.js - 为什么在 Node.js CPU 绑定(bind)代码中使用异步模式?

c# - 触发并忘记异步任务与 Task.Run

javascript - 使用 babel 解析器时,Eslint 禁用严格模式

javascript - 1 :1 error Parsing error: Unexpected character '�'

javascript - Google Firestore promise

javascript - 将 Prop 传递给组件 react-router 1.0.x

javascript - 单元格中忽略的 dgrid 空白 css 属性

javascript - localStorage 无法运行 "save"游戏

node.js - NodeJS SetInterval 与 Async/Await

javascript - 如何使用 fetch 和 FormData 发送二进制数据 (blob)?