3

まず、グローバル変数を宣言し、それを 0 に設定しまし
た。内部関数で var を別の値に設定したいのですが、出力が (グローバル) 外部変数に設定されず、ローカル変数として設定されます。変数。私の他の問題は、出力を取得する順序です。

出力:
third0
first0
second3

$(document).ready(function() {
    state = 0;
    $('#btnlogin').click(function() {
        $.post("php/redirect.php", {
            Username : $('#qi').attr('value'),
            Password : $('#password').attr('value')
        }, function(data) {
            console.log('first'+state);
            state = 3;
            console.log('second'+state);
        });
        console.log('third'+state);
    });
});
4

3 に答える 3

1

これは、 (AJAX) 呼び出しconsole.log('third'+state);の外にあり、呼び出しが ajax 応答よりも速いために発生します。$.post

AJAX が非同期であると誤解しているようです。

于 2012-05-10T12:24:51.027 に答える
1

$.post問題は、ポストコールがサーバーから返されたときに、コールの内部関数が最初に実行されることです。

したがって、ボタンがクリックされると、プログラムの流れは次のようになります。

$.post("php/redirect.php",これにより、サーバー側で redirect.php メソッドが呼び出され、呼び出しが完了すると次の関数が呼び出されます。

function(data) {
  console.log('first'+state);
  state = 3;
  console.log('second'+state);
}

その後、関数は続行し、次のコードを実行します。

console.log('third'+state);

この時点では状態はまだ 0 なので、出力はthird0です。

次に、ajax 呼び出しが完了し、上記の関数を呼び出して、次のように出力します。

first0
second3

問題は、内部で定義した関数を含め、メソッド内の行がスクリプトに表示されるのと同じ順序で実行されることを期待しているだけです。

于 2012-05-10T12:28:30.603 に答える
0

出力は非常に簡単に説明できます。

ドキュメントが読み込まれた後、クリック ハンドラーをボタンにバインドすることから始めます。クリック ハンドラーは次のように動作します。

  • 非同期AJAX 呼び出しの開始
  • ログアウト'third'+state

その時点で状態は 0 なので、最初の出力はthird0です。

しばらくすると、AJAX リクエストが成功し、答えが得られました。回答が得られたら、ログに記録します'first'+statestateまだいる0と、出力が得られますfirst0

その後、 の値stateを 3 に変更し、3 番目の出力に変更すると、 が得られますsecond3

したがって、動作を理解するには、AJAX の非同期バージョンに慣れるか、要求を同期スタイルに変更する必要があります。後者は、リクエストがまだ実行されている間はページにアクセスできなくなるため、非常に悪いです。

于 2012-05-10T12:28:44.723 に答える