0

ANTGalioブラウザを使用して組み込みデバイスで実行するJavaScriptコードを開発しています。

理想的には、別のサーバーにgetリクエストを送信するコードが必要です。そのgetリクエストが行われた後、前のgetリクエストからの応答が受信されるまで、ページはユーザーが別のgetリクエストを送信することを許可しません。

何らかの理由で、ほぼ瞬時にreadyState4を受信することがあります。これは、新しいオブジェクトではなく、以前のXmlHttpRequestオブジェクトを評価しているようです。私は何が間違っているのですか?

 <script type="text/javascript">

var fail= function (env, resp, stat) {

        alert(resp);
};
var succ= function (env, resp) {
};

var canScan = true;

/* start scan */
function scan (name) {
        if (canScan) {
                //deactivate button
                deactivateScanButtons();
                //let server know
                ajax = new XMLHttpRequest();
                var scanUrl = 'http://19X.1XX.X.XX:8080/scan/' + name
                ajax.open('GET', scanUrl, true);
                ajax.onreadystatechange = function() {
                        if (ajax.readyState==4) {
                                //allow button to work again
                                activateScanButtons();
                                alert("ready state 4");


                        };
                };

                ajax.send();
//initiate scan
                xrxScanInitiateScan(
                        'http://127.0.0.1',
                        "ftp.xst",
                        false,
                        succ,
                        fail);
        }

}

function deactivateScanButtons () {
//      canScan = false;

        var indicator = document.getElementById('buttons');
        indicator.style.visibility = "hidden";
}
function activateScanButtons () {
//      canScan = true;

        var indicator = document.getElementById('buttons');
        indicator.style.visibility = "visible";

}
</script>
4

2 に答える 2

1

scan関数内でajaxオブジェクトを定義しますが、そのvar前にキーワードはありません。これは、ローカルではなくグローバルオブジェクトであることを意味します。その後、クロージャができますonreadystate。コールバック関数でその変数を参照します。

そこで何が起こっているのかを正確に追跡するのは難しいと思いますが、あなたの質問であなたが言うように、コールバックがあなたが期待するようにajaxオブジェクトを使用していないことに同意します。あなたはそれが時々起こると言います-2つのリクエストをほぼ同時に行うときに起こりますか(ボタンをダブルクリックするか、そうでなければ2つのgetリクエストを非常に速くトリガーします)?

varajaxオブジェクトを定義する前に、キーワードを使用することをお勧めします。さらに良いthisことに、名前でajaxオブジェクトを参照する代わりに、コールバック関数で使用してみてください。それが機能する場合、あなたは1つの閉鎖を免れています。

于 2011-04-09T19:07:21.847 に答える
1

3つの提案:

  1. クライアント側でのキャッシュを回避するには、ランダムに生成された数値または現在のタイムスタンプをリクエストクエリ文字列に追加します。
  2. Yoniが言ったように、キーワードXMLHttpRequestでオブジェクトを開始します。var
  3. リクエストごとに、現在のタイムスタンプをグローバル変数内に保存します。で、グローバルタイムスタンプがその指定されたリクエストの対応するタイムスタンプと一致する場合にのみonreadystatechange呼び出します。activateScanButtonsこのように、最新のリクエストのみがを呼び出すことができますactivateScanButtons
于 2011-04-09T19:28:18.233 に答える