首页 > 解决方案 > await async - ESLint require-atomic-updates 中的竞争条件错误

问题描述

下面的代码在使用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 的错误:

可能的竞争条件:可能会根据 require-atomic-updatesctx.body的过时值重新分配ctx.body

标签: javascriptasync-awaiteslintrace-condition

解决方案


您可以放心地忽略警告:)

ESLint 旨在捕捉这样的事情:

 let value = 0;

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

race(); race();

在这种情况下,在堆栈上进行记忆,racesa tick,然后回写到. 由于其他代码同时运行,可能已经更改,然后更新可能会关闭......它不是原子的。valueawaitvaluevalue

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


推荐阅读