与计时器异步运行

时间:2011-10-17 10:15:00

标签: javascript timer

我无法弄清楚这段代码有什么问题。它在chrome中运行一次然后崩溃然后运行,依此类推。它无法在Firefox和IE中运行。

<html>
<head>
<title> Async Module Runner </title>
<script type="text/javascript">

var TestRunner = (function(){
var queue = [];
var paused = false;

return {
    run : function( fn ) {
        queue.push(fn);
        if( queue.length > 0 &&  paused != true && queue[0] != undefined ) {
            queue.shift()();
        }
    },

    pause : function(){
        paused = true;
    },

    resume : function(){
        paused = false;
        this.run();
    }
};
})();   

var  AsyncRunner = {};
AsyncRunner.wait = function( fn, time ) {
TestRunner.pause();
setTimeout(function(){
    fn();   
    TestRunner.resume();
}, time);
};

var Test = {
setUp : function(){
    document.write('yep! <br />');
},

tearDown : function(){
    document.write('yep yep <br />');
},

testAsync1 : function(){
  AsyncRunner.wait( function(){ document.write('okay! <br />'); }, 3000 );
},

testAsync2 : function(){
  AsyncRunner.wait( function(){ document.write('okay again <br />'); }, 2000 );
},

testAsync3 : function(){
  AsyncRunner.wait( function(){ document.write('okay again and again!! <br />'); }, 5000            );
}
};

window.onload = function(){
for( var i in Test ) {
    TestRunner.run(Test[i]);
}
};
</script>
</head>
<body>
</body>
</html>

我错过了javascript中的重要内容吗?我做错了什么?

更新 该代码在以下浏览器中运行:Chrome 14.08 - Safari 5.1 它也将按预期在JsFiddle.net中运行。 它会工作但在Chrome 5.0中反复崩溃 它必须在以下浏览器中运行包含SyncRunner.wait()的函数时停止 - 不会发出任何错误:Firefox 3.6 - IE 9 - Opera 10.61

更新2 经过Narenda提供的答案进行了一些调查后,似乎FF 4及以后在这里遇到了麻烦。但我没有其他浏览器的根本原因。 所以问题是在非webkit浏览器中使用document.write() 用以下函数替换document.write(),它现在应该可以工作:

function print( message ) {
    var loc = document.getElementById( 'logpanel' );
    var tag = document.createElement('li');
    if( message != undefined ){
        tag.appendChild( document.createTextNode( message ) );
        loc.appendChild( tag );
    }
}

我仍然有兴趣知道其他浏览器出了什么问题 感谢

1 个答案:

答案 0 :(得分:1)

我收到错误

  

'尝试在已清除的范围'

上运行编译和运行脚本

当我在firefox中运行它时。当它尝试在fn()内调用AsyncRunner.wait时会发生这种情况。

看起来这是firefox 4及其后的错误。看看这些相关的SO问题 Error: Attempt to run compile-and-go script on a cleared scope(特别是最后一个回答是关于使用document.write)和 jQuery Animation error = attempt to run compile-and-go script on a cleared scope

我无法在chrome上重现程序崩溃。