这个javascript setTimeout以一种非常奇怪的方式与ajax请求交互

这个javascript setTimeout以一种非常奇怪的方式与ajax请求交互,javascript,ajax,settimeout,Javascript,Ajax,Settimeout,我正在编写此脚本,以便它显示导入脚本的状态。它应该调用一个函数,每X秒运行一次http请求 function progres_import() { //if(import_status != 'finalizat') { alert("progres_import"); setTimeout(function() { return update_progres_import(); }, 2000); setTimeout(function() { return updat

我正在编写此脚本,以便它显示导入脚本的状态。它应该调用一个函数,每X秒运行一次http请求

function progres_import() {
//if(import_status != 'finalizat') {
    alert("progres_import");
    setTimeout(function() { return update_progres_import(); }, 2000);
    setTimeout(function() { return update_progres_import(); }, 4000);
    setTimeout(function() { return update_progres_import(); }, 6000);
    setTimeout(function() { return update_progres_import(); }, 8000);

    //setTimeout(function() { progres_import(); }, 400);
//}
//else {

//}
}
这是我用来测试功能的。我把评论放进去只是为了表明我最终打算如何处理它。我尝试了所有可能的setTimeout调用,带引号、不带引号、带匿名函数和不带匿名函数

var xmlhttp_import_progres;
function update_progres_import() {
xmlhttp_import_progres=GetXMLHttpObject();
if (xmlhttp_import_progres==null) {
    alert ("Browser does not support HTTP Request (xmlhttp_import_progres)");
    return;
}

var url="crm/ferestre/import_progres.php";  
url=url+"?sid="+Math.random();

xmlhttp_import_progres.onreadystatechange=function() {
    if (xmlhttp_import_progres.readyState == 4) {
        progres_resp = xmlhttp_import_progres.responseText;
        progres = progres_resp.split('_');
        import_nrc = progres[0];
        import_nrt = progres[1];
        import_status = progres[2];
        mesaj = 'Progres import: ' + import_nrc + ' / ' + import_nrt;
        //document.getElementById("corp_import_mesaj").innerHTML = mesaj;
        alert(progres_resp);        
    }
};
xmlhttp_import_progres.open("POST",url,true);
xmlhttp_import_progres.send(null);
}
这是progres_导入功能的业务端

当导入过程开始时,我在第一个函数中得到警报(“progress_import”),但第二个函数中的警报(progres_resp)只有在导入过程结束后才会弹出(它仍然保持2秒的间隔,因此设置超时工作)

ajax请求中的php脚本只是获取导入脚本设置的一些会话变量,并将它们打印出来供javascript使用(x导入y总计,z失败,诸如此类)


知道它为什么会这样吗?

xmlhttp\u import\u progres.readyState==4)
仅在请求结束时为
true
。因此,完成请求后会弹出警报对话框

此外,您不能期望您的功能在2秒的间隔后显示警报,因为服务器可能会也可能不会响应得那么快

最后一点注意:如果您想要有一个定期更新函数,请使用
setInterval(function(){…},2000)

编辑
另外,以这种方式添加
var
var xmlhttp\u import\u progres=GetXMLHttpObject()。当前,您正在全局定义HTTP对象,导致只能访问HTTP对象的一个实例。

xmlhttp\u import\u progres.readyState==4)
仅在请求结束时为
true
。因此,完成请求后会弹出警报对话框

此外,您不能期望您的功能在2秒的间隔后显示警报,因为服务器可能会也可能不会响应得那么快

最后一点注意:如果您想要有一个定期更新函数,请使用
setInterval(function(){…},2000)

编辑
另外,以这种方式添加
var
var xmlhttp\u import\u progres=GetXMLHttpObject()。当前,您正在全局定义HTTP对象,导致只能访问HTTP对象的一个实例。

在这里,您能否尝试编辑一点:
<强>请考虑上面的答案,但是这段代码将为您说明:< /强>



在这里,您可以尝试编辑一点:
<强>请考虑上面的答案,但是这段代码将为您说明:< /强>




你能完整地展示这个函数吗:
update\u progres\u import
?我的第一个想法是,服务器端的php脚本不能同时运行,如果是这样的话,我们就完蛋了。你能展示变量
xmlhttp\u import\u progres
吗?我可以猜出你的问题是什么。但是你需要显示更多的细节。@Vietan刚刚粘贴了整个函数。你能完整地显示函数吗:
update\u progres\u import
?我的第一个想法是,在服务器端,php脚本不能同时运行,如果是这样的话,我们就完蛋了。你能把变量
xmlhttp\u import\u progres
也显示出来吗?我猜你有什么问题。但是,你需要展示更多的细节。@ VIDEAN刚刚粘贴了整个函数。我知道服务器可能反应不够快,但这就是为什么我给它基本上是一行回声的整整2秒。是的,但是考虑这个(服务器滞后):请求A,2秒,请求B,响应A,响应B 2秒……我猜要问的问题是:“服务器在执行导入时是否可以在ajax请求中运行php脚本?”(导入也是一个php脚本)您不能在JS中直接从php定义变量。您最好在发送请求之前显示通知(
“发送…”
),并在请求完成后显示结果。我将继续标记您的答案,但我的问题仍然存在:似乎导入脚本正在阻止导入进度脚本运行。这就是为什么它只在最后才开始显示警报。我对服务器端的事情不够精通,所以我甚至不知道你可以同时运行两个脚本。谢谢你的帮助。我知道服务器可能没有足够快的响应,但是这就是为什么我给它基本上是一行回声的整整2秒。是的,但是考虑这个(服务器滞后):请求A,2秒,请求B,响应A,响应B 2秒……我猜要问的问题是:服务器在执行导入时是否可以在ajax请求中运行php脚本?”(导入也是一个php脚本)您不能在JS中直接从php定义变量。您最好在发送请求之前显示通知(
“发送…”
),并在请求完成后显示结果。我将继续标记您的答案,但我的问题仍然存在:似乎导入脚本正在阻止导入进度脚本运行。这就是为什么它只在最后才开始显示警报。我对服务器端的事情不够精通,所以我甚至不知道你可以同时运行两个脚本。谢谢你的帮助。
function progres_import() {
//if(import_status != 'finalizat') {
    alert("progres_import");
    setTimeout(function() { return update_progres_import(0); }, 2000);
    setTimeout(function() { return update_progres_import(1); }, 4000);
    setTimeout(function() { return update_progres_import(2); }, 6000);
    setTimeout(function() { return update_progres_import(3); }, 8000);

    //setTimeout(function() { progres_import(); }, 400);
//}
//else {

//}
}
var xmlhttp_import_progres = [];
function update_progres_import(i) {
    xmlhttp_import_progres[i]= GetXMLHttpObject();
    if (xmlhttp_import_progres[i]==null) {
        alert ("Browser does not support HTTP Request (xmlhttp_import_progres)");
        return;
    }

    var url="crm/ferestre/import_progres.php";  
    url=url+"?sid="+Math.random();

    xmlhttp_import_progres[i].onreadystatechange=function() {
        if (xmlhttp_import_progres[i].readyState == 4) {
            progres_resp = xmlhttp_import_progres[i].responseText;
            progres = progres_resp.split('_');
            import_nrc = progres[0];
            import_nrt = progres[1];
            import_status = progres[2];
            mesaj = 'Progres import: ' + import_nrc + ' / ' + import_nrt;
            //document.getElementById("corp_import_mesaj").innerHTML = mesaj;
            alert(progres_resp);        
        }
    };
    xmlhttp_import_progres[i].open("POST",url,true);
    xmlhttp_import_progres[i].send(null);
}