ESLint:可能的竞争条件:“user.registered”可能会根据“user.registered”的过时值重新分配。(要求原子更新)

Nci*_*fra 5 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;
                }
            };
Run Code Online (Sandbox Code Playgroud)

该线user.registered = true;似乎在对象下方显示警告user。我不明白为什么这表明,因为无论上面发生什么,我们都会通过引用传递对象,因此registered当代码继续时我们可以获得键的最新值。

Nci*_*fra 3

这似乎是误报。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;
                }
            };
Run Code Online (Sandbox Code Playgroud)

然后执行:

Promise.all([createUserWrapper(user), createUserWrapper2(user)]).then(() => {
...
});
Run Code Online (Sandbox Code Playgroud)

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