Php Javascript AJAX函数调用延迟

Php Javascript AJAX函数调用延迟,php,javascript,ajax,function,return,Php,Javascript,Ajax,Function,Return,我似乎不知道如何让这个函数工作。要看到的关键是tStat=xmlhttp2.responseText似乎被延迟了。我让它用.innerHTML+=“withintest”+Stat测试这个。它打印出“withintest withintest withintest 0”。所以它进行了几次迭代,直到得到值??0是我想要的Stat值,checktStatus.php从数据库获取它 但是由于这个函数返回一个值,并且我将它从另一个函数调用到该值的变量中,所以在返回之前不能延迟DB read。但我不知道如

我似乎不知道如何让这个函数工作。要看到的关键是tStat=xmlhttp2.responseText似乎被延迟了。我让它用.innerHTML+=“withintest”+Stat测试这个。它打印出“withintest withintest withintest 0”。所以它进行了几次迭代,直到得到值??0是我想要的Stat值,checktStatus.php从数据库获取它

但是由于这个函数返回一个值,并且我将它从另一个函数调用到该值的变量中,所以在返回之前不能延迟DB read。但我不知道如何才能做到这一点!帮忙

编辑:删除了一些注释代码,但问题仍然存在。它返回一个“未定义”的值,然后才能得到一个真正的值

function gettStatus()
{
    var tStat;

    if (window.XMLHttpRequest)
    {     // code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp2=new XMLHttpRequest();
    }
    else
    {     // code for IE6, IE5
            xmlhttp2=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp2.onreadystatechange=function()
    {
      if (xmlhttp2.readyState==4 && xmlhttp2.status==200)
        {
            tStat=xmlhttp2.responseText;        

            document.getElementById("txtHint").innerHTML+=" withintest "+tStat;
            return tStat;
        }
    }
    xmlhttp2.open("GET","checktStatus.php?tID=1",true);

    xmlhttp2.send();    
}

注释掉的行用于过滤

应该是

if (xmlhttp2.readyState==4 && xmlhttp2.status==200)
{
    tStat=xmlhttp2.responseText;        
    document.getElementById("txtHint").innerHTML+=" withintest "+tStat;
    return tStat;
}
onreadystatechange
的工作原理
onreadystatechange
事件处理程序(正如事件名称所示)在更改
readyState
时被调用。因此,您必须检查状态和状态(正如您在评论的部分中所做的那样)

请参阅此处的更多详细信息:

readyState
值列表 从上面引用的页面():

readyState值的完整列表如下所示:

  • 0(未初始化)
  • 1(装货)
  • 2(已加载)
  • 3(互动)
  • 4(完整)
AJAX的异步特性 您还应该知道一个事实,即AJAX通常是异步工作的,因此您可以更轻松地传递在收到响应后将执行的回调,如下所示:

function gettStatus(callback){
    // do something here...
    callback(result); // ...and execute callback passing the result
}
gettStatus(function(tStat){
    // tStat here is accessible, use it for further actions
});
解决方案 因此,您应该编辑代码,使其看起来与此类似(未注释
readyState
/
状态
条件):

然后就这样使用它:

function gettStatus(callback){
    // do something here...
    callback(result); // ...and execute callback passing the result
}
gettStatus(function(tStat){
    // tStat here is accessible, use it for further actions
});
而不是以以下方式使用它:

var tStat = gettStatus();
// tStat would be available here, if gettStatus() would not involve
// asynchronous requests

尝试使用js库,比如jquery。你会在几行中得到一些稳定的东西,但是肯定有一种方法可以只在它收到tStat的值后返回吗?即使在onreadystatechange取消注释之后,它似乎仍然不会等待响应加载,它只是从return语句发送一个“未定义”的值。Argg…@user1094790:您无法从Ajax调用返回。它是异步的。使
getstatus
接受回调并在
readystatechange
处理程序中调用它,传递响应。还可以在这里搜索ajax调用返回的
javascript
。Arg可能重复,实际上我不知道为什么要注释掉它,但这不是问题所在。一旦取消注释,代码在返回之前仍会继续移动。我实际上有一行代码:val tStatus=getstatus();但它在函数返回值之前执行该行!因此,它使tStatus成为“未定义的”。因此,我需要一种方法来延迟此操作或处理此问题的正确方法。@user1094790:这是因为请求是异步发送的(“AJAX”中的“a”字母)。您应该使用回调来处理这个问题(将函数传递给
getstatus
,以便在正确处理请求后执行)。因此,您的“解决方案”实际上不是解决方案;)(从某种程度上说,
返回tStat;
有效)。@FelixKling:我必须确认你是对的。我应该早点发现并更新我的答案。Felix,我现在就做,这样你就可以发表你的反馈了。readyState被注释掉是个意外,我只是尝试了不同的方法来解决这个问题:函数返回值的时间晚了。请阅读我对另一个答案的评论,以获得更深入的信息。我只是不知道该怎么处理这件事。谢谢你。