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;
}
};