我正在编写此脚本,以便它显示导入脚本的状态。它应该调用一个函数,每 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/