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(); 没有这个,发送命令也可以在它有任何机会执行onreadystatechange函数之前完成。

  • 使用 ajax.onreadystatechange = function () { ... result.xxx = tabImage; 声明函数 remplissageDynamiqueImagesParId(idImag, result) { ... } }

  • 打电话给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);    
}

但不幸的是,我无法从第一次执行中获得我的表,它从第二次开始正常工作。但不幸的是,这并不能解决我的问题。有谁知道我如何阻止执行,直到 ajax.onreadystatechange 完成执行。谢谢您的帮助。

于 2013-04-16T01:08:34.690 回答