函数的执行顺序不正确

order of execution of the functions do not work properly

本文关键字:不正确 顺序 执行 函数      更新时间:2023-09-26

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

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

运行后,我得到这个:

  • 在测试
  • 1
  • 2
  • 3
  • 鳍测试
  • 4
  • 4
  • 5
  • 身材表:5
  • 4
  • 5
  • 身材表:5

为什么这个顺序?
我怎样才能拿到桌子?

原因是'Ajax'中的'A'代表异步。执行异步命令的函数不会等待命令完成。相反,当动作完成时,可以放置一个回调例程来触发(在本例中,它被放置到'onreadystatechanged'处理程序中,该处理程序在某些"就绪状态"发生变化时被调用。

特别是形式为a=function(params) { ... }的语句不调用函数,但它声明或定义了函数。

我无法测试这个函数,因为我的本地主机上没有相同的内容,但我可以建议一些必要的更改。

  • 切换ajax.onreadystatechange = function () { ... }ajax.send();的顺序如果没有这个,发送命令也可以在它有机会执行onreadystatechange函数之前完成。

  • 声明函数remplissageDynamiqueImagesParId(idImag, result){…}用ajax。Onreadystatechange = function(){…结果。xxx = tabImage;}

  • 呼叫var result={}; tab = remplissageDynamiqueImagesParId(10, result);

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

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

我试试这个:

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完成它的执行。谢谢你的帮助。