0

基本的に私は持っています

correctData = false//global variable
function calledFirst()
{
        xmlhttp.onreadystatechange=function()
        {
            if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
            {

                proceedDiv.innerHTML = xmlhttp.responseText
                if(xmlhttp.responseText == "You may continue.")
                    correctData = true
                else
                    correctData = false
            }
        }
        xmlhttp.open("GET", "process.php?proposed="+encodeURIComponent(mon2),true);
        xmlhttp.send()
        calledSecond()
}
function calledSecond()
{
    if(!correctData)
    {
     //uh-oh

の値は Ajax 応答に依存し、calleSecond はそれを使用するcalledSecond()ため、Ajax 応答が完了する前に呼び出されているように見えます。correctDataどうすればこれを修正できますか?

更新:関数呼び出しをコールバック セクションに入れると機能しますが、なぜ機能するのでしょうか? Ajax は非同期であり、コードの残りの部分は Ajax が完了するのを待たないため、それが機能しないと私に確信させました。

4

2 に答える 2

2

AJAXそれが非同期である理由です。コンパイラは、ページの残りの部分をコンパイルする前に、AJAX 呼び出しが完了するのを待ちません。

calledSecond() を 2 番目に呼び出したい場合は、それをコールバック関数に入れる必要があります。

于 2013-07-11T20:13:48.870 に答える
2

これは、Ajax リクエストが非同期で処理されるために発生しています。基本的に、リクエストの処理中にコードの他の部分が実行されます。応答に依存する関数がある場合は、それをコールバックに入れます。これにより、リクエストが完了する前に関数が呼び出されないことが保証されます。コールバックは、リクエストが満たされた後にのみ実行されるためです(readyState == 4およびstatus == 200)。次のようになります。

    xmlhttp.onreadystatechange=function()
    {
        if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
        {
            proceedDiv.innerHTML = xmlhttp.responseText
            if(xmlhttp.responseText == "You may continue.")
                correctData = true
            else
                correctData = false
            calledSecond()
        }
    }

編集:非同期イベントがどのように機能するかについて混乱しているように見えるので、簡単な概要を説明します。非同期イベントは、プログラムの流れの影響を受けないという点で、通常のイベントとは異なります。つまり、他のイベントとは完全に独立して実行されるということです。これにはさまざまな理由がありますが、AJAX では、適切な HTTP 応答を待つのに長い時間がかかる可能性があるため、その理由の 1 つは、応答を待機しながら、その応答に依存しない他のことを実行する方がはるかに効率的であるためです。 . プログラムで次のイベントが発生する前に非同期イベントが処理されるとは決して想定できないため、非同期プログラミングを行うときは特に注意する必要があります。. 非同期イベントの結果に依存するものがある場合は、非同期イベントが完了したときに呼び出されるコールバックに配置する必要があります。これでいくつかのことが明確になることを願っています。

于 2013-07-11T20:14:32.170 に答える