ESLint:可能的竞争条件:可能基于过时的user.registered值重新分配user.registered。 (require-atomic-updates)

时间:2019-07-11 08:36:28

标签: javascript node.js async-await eslint

我创建了一个异步函数,如下所示:

let createUserWrapper = async function(user){
                await Log.createUser(user);
                if (!user.registered) {
                    user.registered = true;
                    //userToSave has been declared outside of this function's scope
                    userToSave = true;
                }
            };

user.registered = true;行似乎在user对象下显示了警告。我不明白为什么会这样显示,因为在等待中发生的任何事情,我们都通过引用传递对象,因此在代码继续执行时,我们拥有registered键的最新值。

2 个答案:

答案 0 :(得分:0)

尝试一下:

user.registered = false;
let createUserWrapper = async function(user){
  await Log.createUser(user);
  if (!user.registered) { // registered value from createUser(user)
      user.registered = true;
      //userToSave has been declared outside of this function's scope
      userToSave = true;
  }
};

答案 1 :(得分:0)

这似乎是错误的肯定。 ESLint假设await Log.createUser(user);行正在处理user对象数据,因此,如果我们要并行使用另一个类似于上面的异步函数,例如:

let createUserWrapper2 = async function(user){
                await Log.createUser2(user);
                if (!user.registered) {
                    user.registered = true;
                    //userToSave has been declared outside of this function's scope
                    userToSave = true;
                }
            };

然后执行:

Promise.all([createUserWrapper(user), createUserWrapper2(user)]).then(() => {
...
});

考虑到Promise.all()中的并行执行,在两个函数的每一个中注册的user。的值可能不是最新值的值,而是旧的来自“自己的”异步函数的值。我仍然认为这有点混乱,考虑到执行是线性的,并且对象是通过引用传递的,因此无法完全指出应该显示的内容,因此每个执行滴答都将包含最新的对象数据。