4

jQuery ajax() メソッドを使用してデータを別の ExportData ページに渡し (GET)、そのページの処理後に返されたデータ (「成功/失敗」) を取得しています。ExportData ページが「成功/失敗」を返すまでに約 10 秒かかります。

私が使用しているコードは、他のブラウザー (FF/IE/Chrome) ではうまく機能しますが、Safari では機能しません。Safari のコード インスペクターで表示されるステータス コードは -1001 で、データを受信して​​いません。他の ajax() リクエストがあり (このページがデータを返す限り必要ではありません)、それらは機能します (ステータスは 200 です)。

データの送信と受信の間隔が長いと、Safari でエラーが発生するのではないかと推測しました。ただし、-1001 エラーがすぐに表示されることもわかりました。これは、ExportData.php が実行されなかったことを意味している可能性があります。

誰かがこの問題について考えを持っていますか? あなたの助けは大歓迎です!

コードは次のとおりです。

ExportData: function (date,view) {
    ajaxcall.data = {};
    ajaxcall.url = 'ExportData.php?Date='+date+'&View='+view;
    ajaxcall.callbackfunction = UserEvents.ExportSuccess;
    ajaxcall.Call();
},

「ajaxcall」は別のファイルにあります。

var ajaxcall = {
    SitePath: '',
    data: '',
    url: '',
    callbackfunction: '',
    fileElementClass: '',
    AjaxRequest: false,
    callback: true,
    Call: function () {
        if (ajaxcall.AjaxRequest == true) {
            alert(ajaxcall.AjaxRequest);
            return;
        }
        else {
            try {
                ajaxcall.AjaxRequest == true;
                $.ajax({
                    type: "GET", 
                    url: ajaxcall.url,
                    data: ajaxcall.data,
                    dataType: "json",
                    async: false,
                    success: function (data) {
                            if (ajaxcall.callback == true) {
                                ajaxcall.callbackfunction(data);
                            }
                    },
                    error: function (request, status, error) {},
                    complete: function () {
                        ajaxcall.AjaxRequest = false;
                    }
                });
            }
            catch (e) {
                ajaxcall.AjaxRequest == false;
            }
        }
    },
};

ありがとう、ショーン・リュー

4

2 に答える 2

6

これは古い質問であり、あなたが答えを見つけたかどうかはわかりませんが、最近同じ問題に遭遇しました. 多くの調査とテストの結果、Safari は同期 AJAX 呼び出しのタイムアウト設定を無視し、10 秒に制限していることがわかりました。これはユーザー エクスペリエンスの問題だと考えられます。同期呼び出しを行うとページがハングしたように見えるためです。長時間実行すると、ユーザー フレンドリーではないか、ページが応答しないと見なされる可能性があります。

したがって、基本的に 2 つのオプションがあります。コードを変更して、出力バッファーを使用して定期的にデータを送り返すことができます。これにより、リクエストが少なくともアクティブで応答していることを Safari が認識し、通常は強制的にタイムアウトすることはありません。私たちはこれを試したことがないので、私はそれを保証することはできませんが、あちこちでさまざまな成功の話をいくつか見てきました. もう 1 つのオプションは、AJAX 呼び出しを非同期に変更することです。これはおそらく最も簡単な方法ですが、アプリケーションが同期呼び出しに依存している場合は、同期応答を「シミュレート」するためにいくつかの promise を実装する必要がある場合があります。

参考までに、問題の追跡を開始した場所は次のとおりです: http://propercode.com/wordpress/?p=32

于 2014-03-31T16:33:40.337 に答える
1

設定オブジェクトに atimeoutを設定してみてください。

リクエストのタイムアウト (ミリ秒単位) を設定します。これは、 $.ajaxSetup()で設定されたグローバル タイムアウトをオーバーライドします。タイムアウト期間は、$.ajax 呼び出しが行われた時点から始まります。他のいくつかのリクエストが進行中で、ブラウザに利用可能な接続がない場合、リクエストが送信される前にタイムアウトになる可能性があります。jQuery 1.4.x 以下では、リクエストがタイムアウトした場合、XMLHttpRequest オブジェクトは無効な状態になります。オブジェクト メンバーにアクセスすると、例外がスローされる場合があります。Firefox 3.0+ のみで、スクリプトと JSONP リクエストはタイムアウトでキャンセルできません。タイムアウト期間後に到着した場合でも、スクリプトは実行されます。

于 2012-08-29T12:50:14.453 に答える