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-адрес будет исправлен для всех последующих запросов.