JSONP несогласованная ошибка: объект не является функцией
Я пытаюсь использовать jsonp с jQuery, но я получаю непоследовательное поведение. Иногда сценарий работает, иногда нет; я действительно не понимаю, почему.
Это ошибка, которая может отображаться Chrome:
Uncaught TypeError: Property 'jQuery18208278296771459281_1362854738133' of object [object Object] is not a function
В следующем примере, я пытаюсь проверить, является ли приложение или нет. Но это непоследовательное поведение может произойти на других подобных вызовах ajax:
$.ajaxSetup({
error: function (req, status, ex) {},
success: function (data, status, req) {},
timeout: 2000,
crossDomain: true,
contentType: "application/json",
dataType:"jsonp",
url: "http://myUrl.com/ping.php?preventCache="+new Date()
});
return $.ajax();
файл PHP на стороне сервера довольно прост тоже:
<?php
header("Content-Type: application/javascript; charset=UTF-8");
echo $_GET['callback'];
?> ({ "status": "online" })
3 ответов
ваш вопрос не так ясен, я получал ту же ошибку, когда пытался использовать одно и то же имя функции обратного вызова дважды. в любом случае именно так jsonp должен быть вызван в jquery :
var mycallback = 'c'+Math.floor((Math.random()*100000000)+1);
$.ajax({
type: 'GET',
url: URL,
async: true,
jsonpCallback: mycallback,
contentType: "application/json",
dataType: 'jsonp'
}).done(function(json){
console.log(json);
callback(json);
}).fail(function(f){
console.log("f");
console.log(f.status);
}).always(function(){
// console.log('complete');
});
вы получите это поведение, когда ваш вызов JSONP истекает (что составляет две секунды, согласно вашему timeout: 2000
line), но данные поступают после того, как тайм-аут произошел.
JSONP не использует обычный XmlHTTPRequest. Чтобы сделать JSONP, jQuery вставляет тег сценария в документ и делает временную функцию для обработки загрузки тега сценария (имя функции-это длинная случайная строка в сообщении об ошибке).
когда ваш тайм-аут происходит, а сценарий не завершив загрузку, jQuery отбрасывает временную функцию. Через некоторое время тег скрипта завершает загрузку и пытается вызвать эту функцию, но слишком поздно, функция была удалена. Отсюда и ошибка.
возможно, вы можете сделать меньше ошибок, расширяя свой тайм-аут, но основная проблема заключается в том, что вы не можете отменить загрузку тега script. Если он не ошибся, всегда есть шанс, что это займет немного больше времени, чем ваш тайм-аут. Насколько я знаю, нет аккуратного решения для этого. Вы можете сказать jQuery использовать явно именованную функцию в качестве обратного вызова JSONP вместо создания собственного, но тогда вам нужно будет отслеживать, истекает ли время ожидания. Вы можете использовать CORS, что совсем другое дело.
вероятно, ваш лучший выбор-жить с этим.
Проверьте, делает ли ваш скрипт идентичный запрос AJAX более одного раза подряд.
У меня был неисправный обработчик событий, который запускал два запроса одновременно, и это вызвало ту же проблему.
(Я предполагаю, что вы называете $.ajaxSetup once): похоже, вы собираетесь применить Cache buster для своих вызовов ping, но делаете это в $.ajaxSetup может иметь противоположный эффект, поскольку URL-адрес будет исправлен для всех последующих запросов.