1

После ajax запроса function(data) проверяю наличие нужного объекта.

..., function(data)
{
    if (typeof(data.ads.photo) == "undefined")
        {
           console.log ('есть фото');
        }
    else
       {
          console.log ('нет фото');
       }
}

В чём проблема. Такая проверка не заходит ни в if ни в else

Но если поставить проверку:

if (typeof(data.ads) == "undefined")

тогда показывать наличие или отсутствие. Что может быть не так?

Alexandr_TT
  • 110,146
  • 23
  • 114
  • 384

2 Answers2

3

Так как data.ads неопределено, попытка обращения к data.ads.photo вызывает исключение, прерывающее исполнение кода.

if (!data || !data.ads || !data.ads.photo)
{
   console.log ('нет фото');
}
else
{
   console.log ('есть фото');
}
  • судя по тому, что проверяется работоспособность через console.log() думаю он бы заметил красную надпись. – MedvedevDev Apr 14 '18 at 18:51
  • 1
    @MedvedevDev "Это - вряд ли." т. Сухов, "Белое солнце пустыни" –  Apr 14 '18 at 18:53
  • Хотя раньше не сталкивался с такой проверкой, не думал что проверка обьекта не существующего обьекта прерывает код, а не показывает false (else) – Менеджер Типографии Apr 14 '18 at 19:20
  • 1
    @МенеджерТипографии Проверка здесь - вторична. Причина ошибки - обращение к свойству несуществующего объекта. –  Apr 14 '18 at 19:32
3

Причина названа в ответе @Igor, я лишь предложу более изящное решение:

..., function(data) {
  let photo, something; 
  try {
    photo = data.ads.photo; 
    something = data.ads.something;  // получение еще каких-либо данных из полей data
  } catch (err) {
    console.log ('опаньки... ' + err.message);
    return; 
  }
  ... // делаем что-то с photo и прочими значениями из data. Если код здесь тоже небезопасен, то его можно перенести в тело try
}

var rslt = document.getElementById('result'), 
    btns = document.querySelectorAll('.test-btn'); 
for (let btn of btns)
  btn.addEventListener('click', fetchData);

function fetchData(e) { console.clear(); rslt.textContent = '\tПолучение данных... '; fetch('https://httpbin.org/get').then(r => r.json()).then(data => { let ip, ua, notExists; try { ip = data.origin; ua = data.headers['User-Agent']; if (e.target.id === 'test-two') notExists = data.noObject.noValue; // тут будет ошибка, и выполнение перейдет в catch rslt.textContent += OK\n IP:${ip}\n UA:${ua}\n; } catch (err) { rslt.textContent += 'ошибка!\n'; console.log(err.stack); } rslt.textContent += '\tЗавершено.'; // выполняется вне зависимости от ошибок в try }); }

#result {
  height: 100px; overflow-y: auto; 
  font: 14px monospace; white-space: pre-wrap;
  background-color: #222; color: #4d4;
}
<button id="test-one" class="test-btn">Обычный тест</button>
<button id="test-two" class="test-btn">Тест с ошибкой</button>
<pre id="result"></pre>
yar85
  • 10,940