javascript - 为什么它是以下代码中的竞争条件?
问题描述
我将以下代码 ES Lint 标记为竞争条件:
const fillPersonPositions = async (person) => {
person.positions = await getPositions(person.id);
};
完整错误:
Possible race condition: `person.positions` might be reassigned based on an outdated value of `person.positions`.eslint(require-atomic-updates)
如果我将“person.id”更改为与“null”之类的人对象无关的内容,错误就会消失。这里有什么问题以及如何避免它?(我的意思是修复代码,如果它是一个真正的竞争条件问题,或者告诉 linter,如果不是,这不是问题)。
解决方案
如果您fillPersonPositions
多次调用此代码可能会出现问题,并且此id
人的身份同时发生了变化。例如:
person.id = 1;
const p1 = fillPersonPositions(person);
person.id = 3;
const p2 = fillPersonPositions(person);
await Promise.all([p1, p2]);
在这里,不能保证第一个首先fillPersonPositions
解析,所以最后,您可能会person
得到一个 ID 为 3 的属性,但positions
属性对应于 ID 1。
当然,上面说的很做作,但是 ESLint 并不知道。
一种可能的解决方法是避免突变,而是返回(并使用)一个新对象:
const fillPersonPositions = async (person) => {
const positions = await getPositions(person.id);
return { ...person, positions };
};
(无论如何,为了更易于理解的代码,尽可能避免突变通常是一个好主意 - 出于类似的原因,const
这是一个比let
你有选择权时更好的选择)
推荐阅读
- linux - 用“|”将 2 个 csv 文件加入到第三个文件中 作为分隔符
- azure - Azure 中 Verizon CDN 中的压缩行为
- azure - 如何使用 Azure SQL 实现跨多个区域(而非复制)的数据
- sorbet - Sorbet:如何为动态生成的方法添加签名?
- r - 通过子集行创建多个数据帧的输出函数
- java - Py4j 教程的问题
- c# - 阐明自变量、参数和类型如何工作
- regex - Make:使用正则表达式检测平台
- c# - 比较 DateTime 和解析的 DateTimeOffset 刻度的差异
- python - python在读取csv文件时忽略带括号的分隔符