ESLint: Возможное условие гонки: `user.registered` может быть переназначен на основе устаревшего значения` user.registered`.(Требуется атомным обновление) - PullRequest
0 голосов
/ 11 июля 2019

Я создал асинхронную функцию, как показано ниже:

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. Я не понимаю, почему это показывает, так как все, что происходит выше в await, мы передаем объекты по ссылке, поэтому у нас есть последнее значение клавиши registered, когда код продолжается.

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Это похоже на ложный положительный результат. 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.registered в каждой из двух функций может быть не значением из последнего значения, а старым из «собственной» асинхронной функции. Я все еще думаю, что это немного грязно, и я не могу точно указать, что он должен показывать, учитывая, что выполнение является линейным, и объекты передаются по ссылке, поэтому каждый тик выполнения будет иметь самые последние данные объекта.

0 голосов
/ 11 июля 2019

Попробуйте это:

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