如何将所有脚本延迟指定的时间

How can I delay ALL scripts for a specified duration?

本文关键字:时间 延迟 脚本      更新时间:2023-09-26

我正在开发一款严格基于javascript的游戏。我想要的是定期将某些信息打印到屏幕上。够简单吗?对但问题是,我只想延迟一些文本打印到屏幕上的方式(将文本添加到div的innherHTML中)。

我知道setInterval和setTimeout方法,但这些方法的问题在于,它只会延迟在脚本的其余部分继续运行时调用某个函数所需的时间。我想要的是暂停一切,在经过一定的持续时间之前根本不允许javascript前进。

我可以想出一个解决方法——不直接写入innerHTML属性,而是写入一个字符串队列,然后使用setInterval方法在队列中有任何内容等待时显示一行文本。这并不难,但我想知道Javascript是否有任何类型的暂停所有命令可以做同样的事情。目前我正在回避jQuery。

谢谢!

不,根本没有这样的东西。Javascript是异步的,您不能停止其他"线程"。您可以做的是使用一些全局变量或主程序类方法来停止游戏进程
简单的穷人游戏类:

function Game() {
    var run = true;
    this.pause = function() {
        run = false;
    }
    this.go = function() {
        if(run)
          return false;
        run = true;
        heartbeat();
    }
    function heartbeat() {
       /*Do game rendering or whatever you want to pause*/
       if(run)
         setTimeout(heartbeat, 100);  //tick
    }
}

您可以使用以下内容"冻结"页面本身:

var start = new Date().getTime(), delay = 5000; // milliseconds
while(new Date().getTime() < start+delay) {}

然而,这也会冻结整个浏览器,通常会导致浏览器崩溃、Windows出现"未响应"框,或出现"此脚本运行需要很长时间,是否终止?"问题。

"正确"的方法是有一个"isPaused"布尔值,你可以打开或关闭它,如果它关闭了,函数就会尝试再次运行。类似这样的东西:

function pauseCheck(thisobj,argobj) {
    if( isPaused) {
        setTimeout(function() {argobj.callee.apply(thisobj,Array.prototype.slice(argobj,0));},250);
        return false;
    }
    return true;
}

然后在您的其他功能中:

function doSomething(x,y) {
    if( pauseCheck(this,arguments)) {
        // function body here
    }
}