私のアプリケーションでは、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);