Почему условие if не предотвращает сбой сценария? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть скрипт, который я запускаю с помощью терминала, и он всегда работает хорошо, но иногда случайным образом выдает следующее сообщение об ошибке:

TypeError: Cannot read property 'Name' of undefined

Этот скрипт проходит через те же строки кода через раз, прежде чем он падает из-за этой ошибки. Вот проблемная строка c:

setTimeout(function() {deleteAlert(data[This].Name, intent); }, 2000);

Как предотвратить сбой моей программы? Я попытался сделать это:

  if (data[This] && data[This].Name) {
    setTimeout(function() {deleteAlert(data[This].Name, intent); }, 2000);
  } else {
    console.log(colors.red('ATTENTION: ') + "alert not deleted");
  }

Но все равно иногда выдает ошибку в той же строке. Я имею в виду, что он успешно проходит через data[This] && data[This].Name и затем выдает ошибку. Как изменить это условие, чтобы эта ошибка не повредила sh мой сценарий?

1 Ответ

1 голос
/ 27 апреля 2020

Асинхронность.

Это

deleteAlert(data[This].Name, intent)

действительно может выдать ошибку, если data[This].Name не определено, но вы делаете безопасную проверку за две секунды до и между моментом, когда вы выполните безопасную проверку, и в тот момент, когда вы позвоните data[This].Name, data, может измениться.

Вы должны выполнить безопасную проверку прямо перед тем, как позвонить data[This].Name, что-то вроде

setTimeout(() => {
  if (data[This] && data[This].Name) {
    deleteAlert(data[This].Name, intent)
  } else {
    console.log(colors.red('ATTENTION: ') + "alert not deleted")
  }
}, 2000)
...