2

私のアプリケーションでは、jquery ajax を使用して、約 1 秒間隔でデバイス データをフェッチします。デバイスには wince os があり、Web ページは httpd Web サーバーによってホストされています。この問題は、Web クライアントを接続してデバイスを 2 日以上実行した後に確認できました。IE ステータス バーに、「'jqXHR' が null またはオブジェクトではありません」というエラーが表示されるか、'jqXHR' が定義されていません (jquery-1.5.2.js の 6819 行目)。また、jquery エラー関数を使用してリクエスト エラーをキャッチしています。しかし、IE によって報告されたこのエラーは、エラー関数によってキャプチャできませんでした

行番号 6819 は、ajax jqXHR オブジェクトが無効であることが判明した jquery setTimeout ハンドラを指します。フィドラーを使用して問題を分析したところ、エラーのあるエントリが見つかりませんでした。しかし、ブラウザでエラーが発生したため、それ以上のリクエストは送信されません。私が想定しているのは、リクエストが IE でブロックされ、サーバーにヒットしなかったため、フィドラーでエントリが表示されなかったということです。ajax リクエストで設定されたタイムアウト値が経過すると、setTimeout ハンドルが実行されます。

jqXHR オブジェクトがどのように未定義になるか、誰か推測できますか? (このオブジェクトは、アプリケーション コードのどの部分でもクリア/初期化されません。また、前の要求が完了した後、要求は一度に 1 つずつシリアルに送信されます。これにより、オブジェクトが上書きされないことが保証されます)

私のアプリケーションで Ajax リクエストがどのように送受信されるか、以下のサンプル コードをご覧ください。

            var ajax_timeout = 10000;
            var requests = 0;
            var jqxhr_obj = null;
            var stop_ajax_reqs = 1;
            var ajax_serial_reqs = {
                "None":0,
                "SystemStatus":1,
                "ScreenData":2,
                "Complete":3
            };
            var AjaxReqIndex = ajax_serial_reqs.None;
            var REQUEST_GAP_TIME = 1000;
            var PERIODIC_TIMER_VALUE = 1500;

            function SendAjaxReq(ajaxData)
            {
                jqxhr_obj = $.ajax(
                {
                    url: 'DeviceData.asp',
                    contentType: "application/x-www-form-urlencoded;charset=utf-8",
                    global: false,
                    type: 'POST',
                    data: ajaxData,
                    dateType: "text",
                    async: true,
                    timeout: ajax_timeout,
                    cache: false,
                    beforeSend: function (){requests++;},
                    complete: function(){ requests--; },
                    success: function (data, status, xmlhttp_obj)
                    {
                        $(xmlhttp_obj.responseText).appendTo("body");
                        stop_ajax_reqs = 1;
                    },
                    error: function (xmlhttp_obj, status, error_obj)
                    {          
                        $("<p>Error: "+ status + " - "+requests+" requests active</p>").appendTo("body");       
                        stop_ajax_reqs = 1;       
                    }
                });
            }

            //Send all the requests for this cycle - initiated by setInterval shown below
            function ManageAjaxSerialReqs()
            {
                if (ajax_serial_reqs.None != AjaxReqIndex)
                {
                    //Check if the previous sent ajax request is complete
                    if ((stop_ajax_reqs == 1) && (requests == 0))
                    {
                        switch (AjaxReqIndex)
                        {
                        case ajax_serial_reqs.SystemStatus:    
                            //First request of the cycle
                            SendAjaxReq("FirstReq");
                            stop_ajax_reqs = 0;            
                            AjaxReqIndex = ajax_serial_reqs.ScreenData;
                            break;
                        case ajax_serial_reqs.ScreenData:
                            //Second request of the cycle   
                            SendAjaxReq("SecondReq"); 
                            stop_ajax_reqs = 0;                  
                            AjaxReqIndex = ajax_serial_reqs.Complete;
                            break;    
                        case ajax_serial_reqs.Complete:
                            //Wait until the cycle is complelete ((stop_ajax_reqs == 1) && (requests == 0))
                            AjaxReqIndex = ajax_serial_reqs.None;
                            break;
                        default:
                            break;
                        }
                    }
                    //Send all the requests until (ajax_serial_reqs.None == AjaxReqIndex)
                    if(ajax_serial_reqs.None != AjaxReqIndex)
                        setTimeout("ManageAjaxSerialReqs()", REQUEST_GAP_TIME);        
                }
            }

            //Periodic timer
            setInterval(function()
            {
                //....do other operation...

                //send periodic requests
                if (ajax_serial_reqs.None == AjaxReqIndex)
                {
                    AjaxReqIndex = ajax_serial_reqs.SystemStatus;
                    ManageAjaxSerialReqs();        
                }

                //....do other operation...

            }, PERIODIC_TIMER_VALUE);
4

0 に答える 0