0

ファックス送信フォームを検証するとき、ソフトウェア ファックス パッケージを使用してファックスがすでに送信されているかどうかを確認しています。これは、スクリプトによって実行されるテーブルへの単純なクエリであり、以前のファックスが存在する場合はテキストを返し、存在しない場合は空白を返します。

応答テキストがある場合でも、flag_stop_fax 変数がまだゼロに設定されていることがわかりました (例: "A fax has already been sent.")。

flag_stop_fax = 0;
xmlhttp.onreadystatechange=function() 
{
    if (xmlhttp.readyState==4 && xmlhttp.status==200) 
    {
        var response = xmlhttp.responseText;
        if (response!='')
        {
            flag_stop_fax = 1;
            alert(response);
        }
    }
}

xmlhttp.open('GET','/check_for_active_fax.php?fax_number=' + fax_number + '&t='+Math.random(),true);
xmlhttp.send();

alert(flag_stop_fax); // shows "0" even when I have a non-blank response from xmlhttp.responseText

これに付随する検証ビットが他にもいくつかありますが、上記のスクリプトが問題を示していることを願っています。私は「t」変数を何にも使用しません。これはブラウザのキャッシュに対する保護手段です。

では、flag_stop_fax が 0 に設定されないのはなぜですか?

4

1 に答える 1

0

まず、AJAX が非同期であることを理解する必要があります。を実行するxmlhttp.send();と、リクエストが送信され、コードの実行が続行されるため、次に実行されるのは次のとおりです。

alert(flag_stop_fax);

この時点でflag_stop_faxは、リクエストがまだ完了していないため、まだゼロです。

指定したコールバック関数は、リクエストが完了したときにxmlhttp.onreadystatechangeのみ実行されます。ここでは、実行はシーケンシャルではありません。それは次のようなものです:

  1. xmlhttp.send();- リクエストが開始されました
  2. alert(flag_stop_fax);- 変数は警告されます

    ...
    ...
    (しばらくして、サーバーが応答したとき)

    xmlhttp.onreadystatechangeが実行され、flag_stop_fax変数が変更されます。

于 2012-10-29T18:42:44.110 に答える