Node.js 为什么等待后的布尔赋值会触发原子更新错误?

Node.js 为什么等待后的布尔赋值会触发原子更新错误?,node.js,eslint,Node.js,Eslint,上述代码将在vscode中生成原子更新错误,表示“可能的竞争条件:搜索可能会根据第10行搜索=false上过期的值重新分配 为什么??它真的创造了数据竞争吗?ESLint不够聪明,无法识别搜索变量的重要性。违反规则的条件: 将变量或属性重新分配给基于其旧值的新值 在读取旧值之后、设置新值之前,yield或await表达式会中断赋值 规则无法轻松验证赋值是否安全(例如,如果赋值变量是本地变量,并且在函数暂停时无法从任何其他位置读取) ESLint看到的逻辑类似于:“如果调用函数时搜索为fals

上述代码将在
vscode
中生成原子更新错误,表示“可能的竞争条件:
搜索
可能会根据第10行
搜索=false
上过期的值
重新分配


为什么??它真的创造了数据竞争吗?

ESLint不够聪明,无法识别
搜索变量的重要性。违反规则的条件:

  • 将变量或属性重新分配给基于其旧值的新值
  • 在读取旧值之后、设置新值之前,yield或await表达式会中断赋值
  • 规则无法轻松验证赋值是否安全(例如,如果赋值变量是本地变量,并且在函数暂停时无法从任何其他位置读取)
ESLint看到的逻辑类似于:“如果调用函数时搜索为false,则在异步方法后重新分配搜索。”它警告说,在调用函数后,但在
等待
解决之前,其他对象可能已将搜索重新分配为true,在这种情况下,在
wait
之后重新分配将基于过时的值执行某些操作,这可能是不可取的

以下不带
search=true
的代码抛出相同的警告:

let searching = false;

const search = async () => {
  if (searching) {
    throw new Error('No parallel process allowed.');
  }
  try {
    searching = true;
    const result = await someAsyncMethod();
    searching = false;
    return result;
  } catch (e) {
    searching = false;
    throw e;
  }
};

尽管你的逻辑是正确的,但ESLint无法确定你的确切意图。请随意禁用此处的规则。

确保
someAsyncMethod
不会再次访问
search()
。不会,但如果它访问了会发生什么@用户8555937
let searching = false;

const search = async () => {
  if (searching) {
    throw new Error('No parallel process allowed.');
  }
  try {
    const result = await someAsyncMethod();
    searching = false;
    return result;
  } catch (e) {
    searching = false;
    throw e;
  }
};