3

問題の説明: こんにちは!

私の XMLHTTPRequest オブジェクトは、準備が整うと、いくつかのことを行います。受け取った responseText は分割され、パラメーターとして に送信されますmyFunction()

myFunction()ここで、応答テキストの部分文字列をパラメーターとして使用して、「n」回呼び出す必要があります。

この作品:

myAjaxObj.onreadystatechange=function() 
    {   
        if(myAjaxObj.readyState==4) 
        {
            if(myAjaxObj.status==200) 
                        {
                            myFunction( myAjaxObj.responseText, id )

これは機能しません:

myAjaxObj.onreadystatechange=function() 
    {   
        if(myAjaxObj.readyState==4) 
        {
            if(myAjaxObj.status==200) 
                        {
                            var count i=0;
                            for( i=0; i < 5; i++ )
                            {   
                                [b]alert("Without this it wont work") [/b]
                                myFunction( myAjaxObj.responseText, i );
                            }

基本的に、alert() のコメントを外さない限り、for ループ内のコードは実行されません。私はjavascriptクロージャーについてどこかで読んだことがあり、それが実行/レンダリングを同期させるという事実

解決策は何ですか?

4

1 に答える 1

3

OK、これは onreadystatechange 関数をポーリングしていないために発生しています。基本的に、呼び出しは非同期であり、readyState 変数を数ミリ秒ごとにポーリングして、いつ変更されるかを確認する必要があります。これが、alert() で動作している理由です。アラートは、AJAX 応答がクライアントによって受信される間、長い一時停止を引き起こしています。アラートが応答を受け取り、必要に応じてコードが実行されると、readyState 変数がチェックされます。

ただし、alert() を使用しない場合、コードは readyState 変数を1 回だけチェックします。

1 つの方法は、呼び出しで非同期パラメーターを false に設定して、呼び出しを同期にすることです。これには、AJAX 応答が受信されるまでクライアントがフリーズするという欠点があります。

もう 1 つの方法は、readyState 変数をポーリングし続けることです。

基本的に、コールバック関数が正しく実行されるとは信じないでください。何度もスタックしてしまいます。

于 2009-10-22T13:02:51.883 に答える