通过jQuery和ajax get的使用我有一个javascript进程的工作模型,它可以轮询一个url,并且会超时或成功返回。该网址由一个带有本地httpd的小型嵌入式盒子提供服务。
php脚本发出重启,等待一秒,然后我们进入javascript代码。
在我们开始我们的ajax get之前,我们需要等待一段时间(大约90秒)以确保服务器httpd实际上已经关闭。否则我们的民意调查将起作用 - 然后当服务器死亡时我们的网页就会崩溃。
所以等我尝试了很多想法。不幸的是,等待必须是模态的,在我们超时之前不会发生任何事情。似乎有效的是一个简单的sleep()抽象:
function sleep(milliseconds)
{
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++)
{
if ((new Date().getTime() - start) > milliseconds)
{
break;
}
}
}
i = 0;
var cText='';
for (i = 0; i < 90; i++)
{
sleep(1000);
cText=cText+'.';
$("#waitmessage").html(MakeFlushable(cText));
}
$.ajaxSetup( ...
不幸的是,这在不同的浏大约30秒后,IE崩溃了。当ajax完成时,Mozilla(8)变得中风并最终恢复。
认为浏览器需要一些响应(以任何形式)我尝试将一个点写入div。在ajax事件完成之前,没有浏览器输出。然后我尝试为每个点附加一堆\ n个字符(其中4000个)(MakeFlushable()执行此操作)。不过,直到ajax完成后才会出现这些点。
回想过去,有一个名为CA Visual Objects的4gl,它提供了一种将控制权交还给“引擎”的方法,以便处理其他内务处理任务。也许这就是这种情况下需要的东西?是否有一个javascript调用,说“做任何家务,然后让我回来控制”?我的猜测是div html没有发送到浏览器,因为javascript卡在我的紧密循环中,等待......
答案 0 :(得分:1)
在javascript中无法进行多线程。所以,有no "sleep" function,所以上面的脚本不断运行 - 这就是IE崩溃的原因。
相反,请尝试使用setTimeout
:
setTimeout(function(){
// code to run after 1000ms
}, 1000);
答案 1 :(得分:0)
为什么不使用setTimeout
或setInterval
来处理您的时间安排?
在回调方法中执行ajax处理。
类似的东西:
var SecondsToWait = 90;
var secInterval = setInterval(oneSecIntervalHandler,1000);
function oneSecIntervalHandler() {
if (--SecondsToWait > 0) {
$("#waitmessage").html( $("#waitmessage").html() + '.');
} else {
clearInterval(secInterval);
//doAjaxStuffNow
$("#waitmessage").html("doAjaxStuffNow...<br/>$.ajaxSetup( ...");
}
}
jsfiddle:http://jsfiddle.net/qSwyQ/