首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在下面的代码中它是竞态条件?

为什么在下面的代码中它是竞态条件?
EN

Stack Overflow用户
提问于 2019-11-19 16:14:47
回答 2查看 500关注 0票数 2

我有以下代码ES Lint标记作为竞态条件:

代码语言:javascript
复制
const fillPersonPositions = async (person) => {
    person.positions = await getPositions(person.id);
};

完全错误:

代码语言:javascript
复制
Possible race condition: `person.positions` might be reassigned based on an outdated value of `person.positions`.eslint(require-atomic-updates)

如果我将"person.id“改为与person对象无关的值,比如"null",错误就会消失。这里的问题是什么?如何避免它?(我的意思是修复代码,如果这是一个真正的竞态条件问题,或者告诉林特,如果不是问题)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-19 16:25:07

如果您多次调用fillPersonPositions,同时人员的id发生更改,则此代码可能会出现问题。例如:

代码语言:javascript
复制
person.id = 1;
const p1 = fillPersonPositions(person);
person.id = 3;
const p2 = fillPersonPositions(person);
await Promise.all([p1, p2]);

在这里,不能保证首先解析第一个fillPersonPositions,所以最终您可能会得到ID为3的person,但是对应于ID 1的positions属性。

当然,上面的内容是人为设计的,但ESLint并不知道这一点。

一种可能的修复方法是避免突变,而是返回(并使用)一个新对象:

代码语言:javascript
复制
const fillPersonPositions = async (person) => {
    const positions = await getPositions(person.id);
    return { ...person, positions };
};

(为了更容易理解的代码,在可能的情况下避免变化通常是一个好主意-出于类似的原因,当你有选择的时候,const是比let更好的选择)

票数 4
EN

Stack Overflow用户

发布于 2019-11-19 16:23:46

代码被标记是因为person不是原子的,因为理论上它可以在异步操作期间在其他地方更改。

您可以通过更改.eslintrc.json文件中的以下条目来启用此规则:

代码语言:javascript
复制
"require-atomic-updates": "off"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58929370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档