论坛首页 Web前端技术论坛

JavaScript里模拟sleep

浏览 2772 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-10-16  

有几种方式,但都不完美

其一,不断循环,直到达到指定时间

function sleep(numberMillis) {
    var now = new Date();
    var exitTime = now.getTime() + numberMillis;
    while (true) {
        now = new Date();
        if (now.getTime() > exitTime)
        return;
    }
}

其实代码并没有让脚本sleep下来, 相反让CPU迅速上到高负荷的附作用。多数现代浏览器会在该段时间内处于假死状态

其二,用xhr同步请求后台程序,比如传2000过去,后台就sleep 2秒后再返回,这种方式也有缺点,当N多客户端都请求后台时,一直保持连接http开销很大。

 

此外,window对象的alert,confirm也可以中断后续代码的执行

 

 

  • 大小: 62.9 KB
   发表时间:2013-10-20  
为何放弃治疗,不用setTimeout?
如果敢做小白,可以尝试Wind.js (http://windjs.org/cn/),它可以实现sleep这样的语法,但需要编译转换成setTimeout

$await(Jscex.Async.sleep(1000));



______________
http://jex.im/
0 请登录后投票
   发表时间:2013-10-21  
setTimeout是王道,之前碰到过频繁调用ocx控件出现 浏览器崩溃问题,就是用setTimeout模拟 sleep解决的
用while方法不能解决问题,cpu仍然在运行js代码
0 请登录后投票
   发表时间:2013-10-22  
// sleep function
var sleep = (function(){
    var queue = [],
        isFree = true;
    return function(fn, delay){
        var args = arguments,
            self = this;
        if(isFree){
            isFree = false;
            setTimeout(function(){
                fn();
                isFree = true;
                if(queue.length !== 0){
                    args.callee.apply(self, queue.shift());
                }
            }, delay);
        }else{
            queue.push(args);
        }
    }
})();

// test
for(var i = 0; i < 10; i=i+1){
	sleep(function(){
		console.log("a");
	},2000); 
	sleep(function(){
		console.log("b");
	},2000);
	sleep(function(){
		console.log("c");
	},2000);
}

 

0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics