【问题标题】:Issue with setinterval/settimeoutsetinterval/settimeout 的问题
【发布时间】:2012-06-16 08:53:02
【问题描述】:

我试图使用 settimeout 在 Javascript 中模拟一个简单的后台线程。

function ThreadManager(timer){
var threadID=1;
if(timer)
    this.frequency=timer;
else
    this.frequency=10;
}
ThreadManager.prototype.frequency;
ThreadManager.prototype.process;
ThreadManager.prototype.kill;
ThreadManager.prototype.add=function(thread)
{
        this.process=new Process(thread,this.threadID++);

}
ThreadManager.prototype.run=function(parent)
{
    if(!parent)
        parent=this;
    try{
        var st=parent.process.getNextStatement();
        if(st==null){
            if(parent.kill)
                clearInterval(parent.kill)
            return;
        }
        else
            eval(st.trim());
    }
    catch(err)
    {
        console.error(err);
    }
    if(st!=null&&!parent.kill)
    {
        parent.kill=setInterval(function(){parent.run(parent)},parent.frequency);
    }
}
function Process(fun,id)
{
    statements=getStatements(fun);
    var threadID=id;
    function getStatements(fun)
    {
        if(!fun)
        {
            return statements;
        }
        var functionString=(""+fun).trim();
        var start=functionString.indexOf("{");
        functionString=functionString.substring(start,functionString.length-1);
        var regx=new RegExp("[\n;]");
        return functionString.split(regx);
    }
    
}
Process.prototype.statements;
Process.prototype.getNextStatement=function()
{
        var cursor=statements.pop();;
        while(cursor==null||cursor==""||cursor=='}'||cursor=="{")
            cursor=statements.pop();
        return cursor;
}
function write(text)
{
    doc=document.getElementById("note");
    note.innerHTML+=text+"<br\>"
}
function f1()
{
    write("a");
    write("a");
    write("a");
}
function f2()
{
    write("b");
    write("b");
    write("b");
    write("b");
}
function test()
{
    write("hii");
    var thread=new ThreadManager(500);
    thread.add(f1);
    thread.run();
    var thread2=new ThreadManager(500);
    thread2.add(f2);
    thread2.run()
    
}

该函数的入口点是test(),它将从一个html 文件的主体onload 调用,该html 文件具有一个id 为“note”的div。 我希望得到像a b a b a b b 这样的输出。 但是 Mozilla 给了a b b b(之后就挂了) 而 Chrome 提供b b b b(并挂起)。 任何人都可以找出我的代码的问题吗?

【问题讨论】:

    标签: javascript dom-events dhtml


    【解决方案1】:

    parent.run(parent) 是循环引用,会导致堆栈溢出。计时器是 asynchronous 并且不会按顺序运行,除非为此目的构建了 queue

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 2020-11-16
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多