javascript:让我们分享控制权

时间:2011-10-19 22:37:14

标签: php javascript jquery ajax

通过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卡在我的紧密循环中,等待......

2 个答案:

答案 0 :(得分:1)

在javascript中无法进行多线程。所以,有no "sleep" function,所以上面的脚本不断运行 - 这就是IE崩溃的原因。

相反,请尝试使用setTimeout

setTimeout(function(){
  // code to run after 1000ms
}, 1000);

答案 1 :(得分:0)

为什么不使用setTimeoutsetInterval来处理您的时间安排? 在回调方法中执行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/