2013-03-09 14 views
7

jsonpをjQueryで使用しようとしていますが、矛盾した動作が発生します。スクリプトが動作することもありますが、時には動作しないこともあります。なぜ私は本当に理解していない。jsonpの一貫性のないエラー:オブジェクトが関数ではありません

これはクロームで表示されるエラーです。次の例では

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" }) 

答えて

5

あなたの質問はあまり明確ではありませんが、同じコールバック関数名を2回使用すると同じエラーが発生していました。どのような場合には、これは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

チェックスクリプトが複数回で、同一のAJAX要求を行っている場合継承。

私は、同時に2つの要求を発生させた障害のあるイベントハンドラを持っていましたが、これは同じ問題を引き起こしました。

(私はあなたが$ .ajaxSetupを1回呼び出すと仮定しています):あなたのping呼び出しにキャッシュバスターを適用しようとしているようですが、$ .ajaxSetupで実行すると、URLが固定されるためその後のすべての要求

15

(あなたtimeout: 2000ラインによると、2秒である)とき、あなたのJSONPのコールがタイムアウトあなたは、この動作を取得しますが、データは後に到着タイムアウトが発生しました。

JSONPは通常のXmlHTTPRequestを使用しません。 JSONPを実行するために、jQueryはドキュメントにスクリプトタグを挿入し、スクリプトタグの読み込みを処理する一時的な関数を作成します(関数名はエラーメッセージの長いランダムな文字列です)。

タイムアウトが発生し、スクリプトの読み込みがまだ完了していない場合、jQueryは一時的な機能を破棄します。その後、スクリプトタグの読み込みが終了し、その関数を呼び出そうとしますが、遅すぎると関数が削除されています。したがって、エラー。

おそらく、タイムアウトを延長することでエラーが少なくなる可能性がありますが、基本的な問題はスクリプトタグの読み込みをキャンセルできないことです。エラーが発生していない場合は、タイムアウトよりも少し時間がかかる可能性が常にあります。私が知っている限り、これにはうってつけの解決策はありません。 JSONPコールバックとして明示的に名前を付けられた関数を使用するようにjQueryに指示することはできますが、自分自身がタイムアウトしているかどうかを追跡する必要があります。 CORSを使うこともできます。これはもう一つのことです。

おそらく、あなたの最善の策は、それと一緒に暮らすことでしょう。

関連する問題