0

私は配列をループするhtmlページに小さなスクリプトを持っています。それはファイルがそこにあるかどうかをチェックするためにajax関数を実行します。そうでない場合は 0 を出力します。問題は、最初の繰り返しの後にハングすることです (ブラウザはそこにずっとロードされたままになります)。接続を閉じる方法はありますか?私はAjaxにかなり慣れていないので、助けてくれてありがとう。

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">                                                                                                                                        
var cnt = 0;                                                                                                                                         
var getNum;
var num = [25, 15, 24, 16, 23, 17, 22, 18, 21, 19, 20];
var response = 1;

function getAjax(sales, cnt, getNum){

    loadDoc(response);

    if(response == 1 )
    {

        if(cnt >= 11)
        {
            cnt = 0; 
        }
        else
        {
            cnt++;
        }
        getNum = num[cnt];
    }
    else{
        getNum = 0;
    }

    document.write(getNum + '<br/>');
}


function loadDoc(response)
{
    var xmlhttp;
    if (window.XMLHttpRequest)
    {// code for IE7+, Firefox, Chrome, Opera, Safari                                                                                                                  
        xmlhttp=new XMLHttpRequest();
    }
    else
    {// code for IE6, IE5                                                                                                                                              
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
            response = 1;
        }
        else
        {
            response = 0;
        }
    }
    xmlhttp.open("GET","randomFile.js",true);
    xmlhttp.send();
}

function runIt(num, cnt, getNum, response){
   setTimeout('getAjax(num, cnt, getNum)', 3000);
}

</script>
</head>
<body>
  <div id="alert"></div>
  <button type="button" onclick="runIt(num, cnt, getNum, response)">Change Content</button>
</body>
</html>
4

1 に答える 1

0

XMLHttpRequest は非同期です。これはここにあるすべてを意味します

xmlhttp.onreadystatechange=function()
{
    if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
        response = 1;
    }
    else
    {
        response = 0;
    }
}

リクエストが行われた、一定期間実行されます。すなわち:

...
loadDoc(response);

// the XMLHttpRequest might not have finished within this gap

if(response == 1 ) // <----- response might have not been updated yet
...

そのため、すぐに を確認するとresponse、まだ更新されていない可能性があります。代わりに、応答に依存して実行する必要があるものはすべて、上記のコールバック関数に配置する必要があります。これには、カウンターのインクリメント ロジックが含まれます。

さらに、response変数を に渡しましたが、はすでにグローバル変数であるloadDocため、何の役にも立ちません。response

于 2013-02-13T05:51:40.827 に答える