0

次の問題があります: 関数の実行順序が正しく機能しません。関数 (テーブル) の戻り値を別の関数で取得したい。非常に単純に思えますが、命令の実行順序が適切に行われていないため、最初の関数の戻り値を取得できないため、複雑になります。

var tabImage = 新しい配列;

function remplissageDynamiqueImagesParId(idImag) {
    alert("1");

    var ajax = new XMLHttpRequest();

    ajax.open("GET", "http://localhost/jsonrecuperImagesParId.php?id=" + idImag, true);

    alert("2");

    ajax.send();

    alert("3");

    ajax.onreadystatechange = function () {
        alert("4");

        if (ajax.readyState == 4 && (ajax.status == 200 || ajax.status == 0)) {
            eval('var data = ' + ajax.responseText + ';');`enter code here`

            var theResults = data.results;

            alert("5");

            for (var i = 0; i < theResults.length; i++) {
                tabImage[i] = new imageFromBase(theResults[i].idImage, theResults[i].url);


            }

            alert("taille tableau:" + tabImage.length);

            return tabImage;
        }
    }
} //fin methode

function test() {
    alert("dans test");

    var tab = new Array();

    tab = remplissageDynamiqueImagesParId(10);

    alert("fin test");

    alert("taille tableau dans test: " + tab.length);
}

実行後、私はこれを取得します:

  • ダンステスト
  • 1
  • 2
  • 3
  • フィンテスト
  • 4
  • 4
  • 5
  • テールタブロー:5
  • 4
  • 5
  • テールタブロー:5

なぜこの注文?
どうすればテーブルを入手できますか?

4

3 に答える 3

1

私は解決策を見つけました。関数openの最後のパラメータをfalseに変更して(同期関数にするため)、実行を重くする可能性のあるアラートを削除します

于 2013-04-18T09:03:08.937 に答える
1

その理由は、「Ajax」の「A」が非同期を表すためです。非同期コマンドを実行する関数は、コマンドが終了するのを待ちません。代わりに、アクションが完了したときにトリガーするコールバック ルーチンを配置します (この場合は、何らかの「準備完了状態」に変更があったときに呼び出される「onreadystatechanged」ハンドラーに配置されます)。

特に、フォームのステートメントはa=function(params) { ... }関数を呼び出しませんが、関数を宣言または定義します。

ローカルホストに同じコンテンツがないため、関数をテストすることはできませんが、必要な変更をいくつか提案できます。

  • との順序を切り替えます。これがないajax.onreadystatechange = function () { ... }ajax.send(); 、send コマンドもonreadystatechange関数を実行する前に終了する可能性があります。

  • 関数 remplissageDynamiqueImagesParId(idImag, result) { ... } を ajax.onreadystatechange = function () { ... result.xxx = tabImage; で宣言します。}

  • と電話するvar result={}; tab = remplissageDynamiqueImagesParId(10, result);

繰り返しますが、これは非同期であるため、最初に呼び出された関数が戻った後、結果はすぐには変更されません。

于 2013-04-14T19:30:55.280 に答える
0

私はこれを試します:

var tabImage=new Array;
function remplissageDynamiqueImagesParId(idImag,tabImage)
{

    var ajax = new XMLHttpRequest();   
    ajax.onreadystatechange=function(){
    alert("4");
     if(ajax.readyState==4 && (ajax.status==200||ajax.status==0)){
     eval('var data = ' + ajax.responseText + ';');  
     var theResults = data.results;
    alert("5");
     for(var i=0;i<theResults.length;i++)
     {
         tabImage[i]=new imageFromBase(theResults[i].idImage,theResults[i].url);


     }
     alert("taille tableau "+tabImage.length);
     return tabImage;

 }

}
    ajax.open("GET","http://localhost/jsonrecuperImagesParId.php?id="+idImag,true);
    ajax.send();
    alert("fin remplissageDynamiqueImagesParId");
}//fin methode
function test() 
{
    alert("dans test");
remplissageDynamiqueImagesParId(10,tabImage);
alert("fin test");
alert("taille tableau dans test: "+tabImage.length);    
}

残念ながら、最初の実行からテーブルを取得できません。2 回目からは正常に動作します。残念ながら、それは私の問題を解決しません。ajax.onreadystatechange が実行を完了するまで実行をブロックする方法を知っている人はいますか?

于 2013-04-16T01:08:34.690 に答える