await async - ошибка состояния гонки в ESLint require-atomic-updates - PullRequest
3 голосов
/ 04 июля 2019

Приведенный ниже код вызывает состояние состязания при проверке с помощью ESLint :

  let match = false

  try {
    match = await something()
  } catch (err) {
    // do something
  }
  if (match === false) {
    // do something
  }

Как лучше написать этот блок кода?

РЕДАКТИРОВАТЬ:

  let request = ctx.request.body || {}
  let password = request.password
  let match = false

  try {
    match = await bcrypt.compare(password, 'xxxxx')
  } catch (err) {
    ctx.throw(401, err)
  }
  if (match === false) {
    ctx.throw(401, 'invalid password')
  }

  ctx.body = {
    message: 'logged in ok'
  }

Ошибка от ESLint:

Возможное состояние гонки: ctx.body может быть переназначено на основе устаревшего значения ctx.bodyrequire-atomic-updates

1 Ответ

1 голос
/ 04 июля 2019

Вы можете смело игнорировать предупреждение:)

То, что ESLint предназначен для ловли таких вещей:

  let value = 0;

  async function race() {
    value += await Promise.resolve(1);
    console.log(value);
  }

 race(); race();

В этом случае race запоминает value в стеке, await ставит галочку, затем записывает обратно в value. Поскольку другой код выполняется в это время, value мог быть изменен, и тогда обновление могло бы быть отключено ... оно не является атомарным.

В вашем случае, однако, вы читаете из ctx.request.body и пишете в ctx.body, так что нет неатомарного обновления. Кроме того, вероятно, нет другого промежуточного программного обеспечения, доступного к тому же ctx в то же время, поэтому не может быть никаких параллельных модификаций. Так что в вашем случае это ложное срабатывание, даже сомнительно, что это в любом случае положительно (это может быть ошибка в ESLint).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...