2013-03-09 4 views
7

jsonp를 jQuery와 함께 사용하려고하는데 일관성없는 동작이 발생합니다. 때로는 스크립트가 작동하지만 가끔은 그렇지 않습니다. 나는 이유를 정말로 이해하지 못한다. jsonp inconsistent error : 객체가 함수가 아닙니다.

는 크롬에 의해 표시 될 수있는 오류입니다 : 다음 예에서

Uncaught TypeError: Property 'jQuery18208278296771459281_1362854738133' of object [object Object] is not a function 

, 난 단지 응용 프로그램이 온라인인지 여부를 확인하기 위해 노력하고있어. 그러나이 일치하지 않는 행동은 다른 유사한 아약스 호출에 발생할 수 있습니다 :

 $.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 파일이 너무 매우 간단하다 : 스크립트는 한 번 이상에서 동일한 AJAX 요청을하고있다

<?php 
header("Content-Type: application/javascript; charset=UTF-8"); 
echo $_GET['callback']; 
?> ({ "status": "online" }) 

답변

5

질문이 너무 명확하지 않아 동일한 콜백 함수 이름을 두 번 사용하려고 시도했을 때 동일한 오류가 발생했습니다. 어떤 경우에 이것은 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'); 
     }); 
2

확인하는 경우 계승.

두 건의 요청을 동시에 처리하는 결함이있는 이벤트 처리기가 있었는데 이로 인해 동일한 문제가 발생했습니다.

($ .ajaxSetup을 한 번 호출한다고 가정합니다.) : ping 호출에 캐시 버스터를 적용하려는 것으로 보이지만 $ .ajaxSetup에서 캐시 버스터를 적용하면 URL이 고정되므로 반대 효과가있을 수 있습니다. 모든 후속 요청.

15

당신은이 동작을 얻을 때 JSONP 호출 (2 초 귀하의 timeout: 2000 라인에 따라입니다) 시간이 초과 있지만 데이터 후에 도착 시간 초과가 발생했습니다.

JSONP는 일반적인 XmlHTTPRequest를 사용하지 않습니다. JSONP를 수행하기 위해 jQuery는 문서에 스크립트 태그를 삽입하고 스크립트 태그로드를 처리하기 위해 임시 함수를 작성한다 (함수 이름은 오류 메시지의 긴 임의의 문자열).

타임 아웃이 발생하고 스크립트가 아직로드를 완료하지 않은 경우 jQuery는 임시 함수를 삭제합니다. 그 후 언젠가 스크립트 태그가 로딩을 끝내고 그 함수를 호출하려고합니다.하지만 너무 늦었습니다. 함수가 삭제되었습니다. 따라서 오류.

아마도 시간 초과를 연장하면 오류가 줄어들지 만 기본 문제는 스크립트 태그로드를 취소 할 수 없다는 것입니다. 오류가 발생하지 않은 경우 항상 시간 초과가 될 수 있습니다. 내가 아는 바로는 이것에 대한 깔끔한 해결책이 없다는 것입니다. JSONP 콜백 대신 명시 적으로 명명 된 함수를 사용하도록 jQuery에 지시 할 수 있습니다.하지만 JSONP 콜백이 자체 타임 아웃인지 여부를 추적해야합니다. CORS를 사용할 수도 있습니다. CORS는 또 다른 모든 것입니다.

아마도 가장 좋은 방법은 함께 살 것입니다.

관련 문제