Виявлення проблем JSONP
Якщо ви не хочете завантажувати залежність, ви можете виявити стан помилки самостійно. Це легко.
Ви зможете виявити помилки JSONP лише за допомогою певного часу очікування. Якщо протягом певного часу немає дійсної відповіді, то припустіть помилку. Однак помилка може бути в основному будь-якою.
Ось простий спосіб перевірити наявність помилок. Просто використовуйте success
прапор:
var success = false;
$.getJSON(url, function(json) {
success = true;
});
setTimeout(function() {
if (!success)
{
alert("Houston, we have a problem.");
}
}, 5000);
Як згадував thedawnrider у коментарях, ви можете замість цього використовувати clearTimeout:
var errorTimeout = setTimeout(function() {
if (!success)
{
alert("Houston, we have a problem.");
}
}, 5000);
$.getJSON(url, function(json) {
clearTimeout(errorTimeout);
});
Чому? Читати далі ...
Ось як JSONP працює в двох словах:
JSONP не використовує XMLHttpRequest, як звичайні запити AJAX. Натомість він вводить a<script>
тег на сторінку, де атрибут "src" є URL-адресою запиту. Зміст відповіді обертається функцією Javascript, яка потім виконується при завантаженні.
Наприклад.
Запит JSONP: https://api.site.com/endpoint?this=that&callback=myFunc
Javascript введе цей тег сценарію в DOM:
<script src="https://api.site.com/endpoint?this=that&callback=myFunc"></script>
Що відбувається, коли a <script>
тег додається до DOM? Очевидно, це виконується.
Отже, припустимо, відповідь на цей запит дав результат JSON, такий як:
{"answer":42}
Для браузера це те саме, що і джерело сценарію, тому він виконується. Але що відбувається, коли ви виконуєте це:
<script>{"answer":42}</script>
Ну нічого. Це просто об’єкт. Він не зберігається, не зберігається, і нічого не відбувається.
Ось чому запити JSONP обертають свої результати у функції. Сервер, який повинен підтримувати серіалізацію JSONP, бачить callback
вказаний вами параметр і замість цього повертає це:
myFunc({"answer":42})
Тоді замість цього виконується:
<script>myFunc({"answer":42})</script>
... що набагато корисніше. У цьому випадку десь у вашому коді є глобальна функція, яка називається myFunc
:
myFunc(data)
{
alert("The answer to life, the universe, and everything is: " + data.answer);
}
Це воно. Це «магія» JSONP. Тоді вбудувати перевірку очікування дуже просто, як показано вище. Зробіть запит і одразу після цього розпочніть тайм-аут. Через X секунд, якщо ваш прапор все ще не встановлено, запит минув.