执行功能的顺序无法正常工作

时间:2013-04-14 19:19:34

标签: javascript function

我有以下问题: 执行功能的顺序无法正常工作。 我想在另一个函数中检索函数(表)的返回值。这看起来很简单但是对我来说很复杂,因为指令执行顺序没有正确完成然后我无法获得第一个函数的返回值。

var tabImage = new Array;

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);
}

跑完后我得到了这个:

  • dans test
  • 1
  • 2
  • 3
  • fin test
  • 4
  • 4
  • 5
  • taille tableau:5
  • 4
  • 5
  • taille tableau:5

为什么这个订单?
我怎样才能拿到桌子?

3 个答案:

答案 0 :(得分: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);
  • 致电

同样,由于这是异步的,因此在第一个被调用的函数返回后,结果不会立即更改。

答案 1 :(得分:1)

我找到了解决方案,只需将函数open的最后一个参数更改为false(使其成为同步函数)并删除可能导致执行繁重的警报

答案 2 :(得分: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完成它的执行。谢谢你的帮助。