0

私は、指定されたサブネットアドレスに情報を問い合わせるWindowsガジェット(「ブラウザ」はInternet Explorerであることを意味します)に取り組んできました。現在、これは比較的速いペース(約5秒ごと)で実行されることがあり、十分に機能します。ただし、準備完了状態1でスタックし、永久にそこにとどまる場合があります。ガジェットがxmlhttprequestを取得し、そこから情報を取得するための関数をやり直そうとすると、状態1のままになります。これは、ガジェットの複数のインスタンスを開いて、そのうちの1つを除くすべてを閉じるときに簡単に複製できます。その時点で、まだ開いているものは、ほとんどの場合、この状態でスタックします。同じウェブサイトにアクセスしている彼ら全員と関係があるのではないかと思います。または、送信中にxmlhttprequestsが停止され、別のリクエストが機能しなくなることに関係している可能性があります。以下は関連するコードです。

//Reference to this for the inner function
var me = this;
var request = new XMLHttpRequest();
request.onreadystatechange = onReadyStateChange;
var url = this.url;
//Make the URL random to prevent being cached
url += ("&a=" + ((new Date()).getTime()));
Trace(DEBUG_COMM, "Sase.updateStatus url: " + url);
request.open("GET", url, true);
request.send();   // fire off the request, calls httpRequestReadyStateChange as things continue
Trace(DEBUG_COMM, "Request sent" + request.readyState); 
function onReadyStateChange() {Trace(DEBUG_COMM, "Sase.httpRequestReadyStateChange: state=" + request.readyState);
    if (4 == request.readyState) {
        Trace(DEBUG_COMM, "Sase.httpRequestReadyStateChange: status=" + request.status);

        if (request.status == 200) {
            Trace(DEBUG_COMM, "retrieved html: " + request.responseText);
            var results = request.responseText;
            var resultsString = request.responseText.toString();
            Trace(DEBUG_COMM, "results String: " + resultsString);
            me.ParseStatusData(resultsString);
        }
        else {
            //me.commError(request.status);
        }

        request = null;
    }
}
4

2 に答える 2

1

さて、私はそれを理解したように見えます。インスタンスが閉じられた場合にのみ発生するため(つまり、サーバーとの通信中にそれらの1つが閉じられた場合、サーバーとの通信は永久に維持され、他のユーザーはサーバーにアクセスできなくなります)、未解決の要求であると感じました。そうだと思われます。複数の領域でコードにいくつかの変更を加えました。基本的には、ガジェットを閉じると、すべてのリクエストが確実に中止されます。リクエストは(それらの中止を可能にするために)インスタンス変数になりましたが、必要になるたびに新しく作成されます。

于 2010-12-10T19:20:49.210 に答える
1

これに遭遇し、具体的なコード例が必要な人のために、ここに行きます。

私も同じ問題を抱えていました。解決策は、XMLHttpRequestオブジェクトを再利用して、新しいリクエストを開始する前に以前のリクエストがキャンセルされたことを確認することでした。複数のAJAXリクエストを飛び回らせたい場合、これは機能しませんが、私の場合、新しいリクエストをトリガーすると、最後のリクエストは不要になります。

私のページのすべてのリクエストは、次のような同じXMLHttpRequestラッパーメソッドを通過しました。

//Declare the XMLHttpRequest object to be re-used
var global_xHttpRequest = null;

function xmlHttpHandler(type, params, complete, postData) {

   //Prevents an issue where previous requests get stuck and new ones then fail
   if (global_xHttpRequest == null) {
       global_xHttpRequest = new XMLHttpRequest();
   } else {
       global_xHttpRequest.abort();
   }

   //Parse out current URL
   var baseURL = window.location.host;
   var svc = "https://" + baseURL + "/processAction?";

   var url = svc + params;

   global_xHttpRequest.open(type, url, true);

   //Add the callback
   global_xHttpRequest.onreadystatechange = complete;

   global_xHttpRequest.send(postData);
}

これは次のように使用できます:

   xmlHttpHandler("GET", params, completeFnc);
于 2015-09-09T13:36:29.130 に答える