5

jQuery

fooサーバーからの応答で変数 ( ) の値を更新する AJAX 要求を作成しています。私が使用しているコードは次のとおりです。

//## My variable ##

var foo = "";


//## Send request ##

$.ajax({
    url: "/",
    dataType: "text",
    success: function(response) {
        foo = "New value:" + response;
    },
    error: function() {
        alert('There was a problem with the request.');
    }
});


//## Alert updated variable ##

alert(foo);

問題は、 の値がfoo空の文字列のままであることです。サーバー側スクリプトの問題ではないことはわかっています。エラー アラートまたは少なくとも文字列"New value:".

問題を示す JSFiddle は次のとおりです: http://jsfiddle.net/GGDX7/

なぜfoo変化しないという価値があるのですか?


純粋な JS

fooサーバーからの応答で変数 ( ) の値を更新する AJAX 要求を作成しています。私が使用しているコードは次のとおりです。

//## Compatibility ##

var myRequest;
if (window.XMLHttpRequest) {
    myRequest = new XMLHttpRequest();
} else if (window.ActiveXObject) {
    myRequest = new ActiveXObject("Microsoft.XMLHTTP");
}


//## My variable ##

var foo = "";


//## Response handler ##

myRequest.onreadystatechange = function() {
    if (this.readyState === 4) {
        if (this.status === 200) {
            foo = "New value:" + this.responseText;
        } else {
            alert('There was a problem with the request.');
        }
    }
};


//## Send request ##

myRequest.open('GET', "response.php");
myRequest.send();


//## Alert updated variable ##

alert(foo);

問題は、の値がfoo空の文字列のままであることです。サーバー側スクリプトの問題ではないことはわかっています。エラー アラートまたは少なくとも文字列"New value:".

これは、問題を示す JSFiddle です: http://jsfiddle.net/wkwjh/

なぜfoo変化しないという価値があるのですか?

4

5 に答える 5

5

の値を警告する時点でfooは、成功ハンドラーはまだ起動されていません。変数を再割り当てするのは成功ハンドラーであるため、その値は空の文字列のままです。

イベントのタイムラインは次のようになります。

  1. foo空の文字列が割り当てられます
  2. AJAXリクエストが作成されてディスパッチされました。
  3. の値fooが警告されます。foo(まだ変更されていないことに注意してください)
  4. AJAXリクエストが完了します。
  5. foo = "New value:" + this.responseText;

foo 値が変更された後にアラートを出したいので、解決策はアラートを成功コールバックに入れることです。

これで、AJAX応答を受信した後に実行されます。

于 2012-12-14T17:53:26.913 に答える
3

「AJAX」の(最初の)Aは非同期を表します。トランザクションはすぐには発生しないためalert()、リモート呼び出しが完了するまでかなり時間がかかります。

于 2012-12-14T17:52:31.647 に答える
2

問題は、リクエストが完了する前にアラートが発生していることです。このコードを試してください:

のコールバック関数にアラートを入れました。$.ajaxつまり、コールバック関数は、.ajaxパーツが完了した後にのみ起動されます。これにより、リクエストを呼び出すと同時に変数にアラートを送信するのではなく、新しいデータを転送して変数を設定し、アラートを送信します。

$.ajax({
    url: "/",
    dataType: "text",
    success: function(response) {
        foo = "New value:" + response;
        alert(foo);
    },
    error: function() {
        alert('There was a problem with the request.');
    }
});
于 2012-12-14T17:54:35.290 に答える
0

問題は簡単です...

alert(foo);

リクエストの処理中に実行され、fooまだ変更されません。

もし、するなら :

$.ajax({
    url: "/",
    dataType: "text",
    success: function(response) {
        foo = "New value:" + response;
        alert(foo);
    },
    error: function() {
        alert('There was a problem with the request.');
    }
});

意図したとおりに機能していることがわかります

于 2012-12-14T17:54:53.387 に答える
0

Ajaxリクエストが終了する前にアラートが実行されています。次のことを試してください。var foo = "";

$.ajax({
    url: "/",
    dataType: "text",
    success: function(response) {
        foo = "New value:" + response;

        alert(foo);
    },
    error: function() {
        alert('There was a problem with the request.');
    }
});
于 2012-12-14T17:55:56.520 に答える