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

标签 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 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_import 函数的业务端。

发生的情况是,当导入过程开始时,我在第一个函数中收到警报(“progress_import”),但第二个函数中的警报(progres_resp)仅在导入过程结束后才开始弹出(它仍然保持2 秒间隔,因此从这个意义上说 setTimeouts 有效)。

ajax 请求中的 php 脚本只获取导入脚本设置的一些 session 变量,并打印它们以供 javascript 使用(x 导入 y 总计,z 失败,类似这样的东西)

知道为什么它会这样吗?

最佳答案

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

此外,您不能期望您的函数在 2 秒间隔后显示警报,因为服务器可能会或可能不会快速响应。

最后一点:如果您想要定期更新功能,请使用 setInterval(function(){...}, 2000)

编辑

另外,按以下方式添加 var:var xmlhttp_import_progres = GetXMLHttpObject();。目前,您正在全局定义 HTTP 对象,导致只能访问该 HTTP 对象的一个​​实例。

关于javascript - 这个 javascript setTimeout 以一种非常奇怪的方式与 ajax 请求交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7684427/

相关文章:

javascript - 如何返回调用函数的次数?

javascript - Jquery中的横幅淡入淡出不起作用

javascript - 如何编写 JavaScript 正则表达式以仅允许字母和数字?

c# - 在 ASP.NET Core 中使用 Ajax 更新下拉列表

mysql - 简单的数据库查看器和搜索工具

javascript - 即使在 href 重定向之后如何使用 setTimeout 循环?

javascript - 我在循环中忘记了什么?

javascript - 为什么 JEasyUI 数据网格加载速度非常慢?

javascript - 遇到 JavaScript 对象作用域和 setTimeout 问题吗?

javascript - 如何使用 PHP ajax JQUERY 创建 3 个依赖下拉列表?