Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript setinterval/settimeout出现问题_Javascript_Dom Events_Dhtml - Fatal编程技术网

Javascript setinterval/settimeout出现问题

Javascript setinterval/settimeout出现问题,javascript,dom-events,dhtml,Javascript,Dom Events,Dhtml,我试图使用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;

我试图使用
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()
    
}
函数线程管理器(计时器){
var-threadID=1;
中频(定时器)
这个频率=计时器;
其他的
这个频率=10;
}
ThreadManager.prototype.frequency;
ThreadManager.prototype.process;
ThreadManager.prototype.kill;
ThreadManager.prototype.add=函数(线程)
{
this.process=新进程(thread,this.threadID++);
}
ThreadManager.prototype.run=函数(父级)
{
如果(!父项)
父=此;
试一试{
var st=parent.process.getNextStatement();
if(st==null){
if(parent.kill)
clearInterval(parent.kill)
返回;
}
其他的
eval(st.trim());
}
捕捉(错误)
{
控制台错误(err);
}
if(st!=null&&!parent.kill)
{
parent.kill=setInterval(函数(){parent.run(parent)},parent.frequency);
}
}
功能流程(乐趣,id)
{
语句=getStatements(fun);
var-threadID=id;
函数getStatements(fun)
{
如果(!有趣)
{
返回语句;
}
var functionString=(“”+fun).trim();
var start=functionString.indexOf(“{”);
functionString=functionString.substring(开始,functionString.length-1);
var regx=new RegExp(“[\n;]”);
返回函数string.split(regx);
}
}
流程、原型、报表;
Process.prototype.getNextStatement=function()
{
var cursor=statements.pop();;
while(cursor==null | | cursor==“”| | cursor=='}’| | cursor==“{”)
cursor=statements.pop();
返回光标;
}
函数写入(文本)
{
doc=document.getElementById(“注释”);
注意。innerHTML+=文本+“”
}
函数f1()
{
写下(“a”);
写下(“a”);
写下(“a”);
}
函数f2()
{
写下(“b”);
写下(“b”);
写下(“b”);
写下(“b”);
}
功能测试()
{
写入(“hii”);
var thread=新的ThreadManager(500);
线程。添加(f1);
thread.run();
var thread2=新的ThreadManager(500);
螺纹2.添加(f2);
thread2.run()
}
函数的入口点是
test()
,它将从id为“note”的div的html文件的body
onload
调用。 我希望得到像
abababb
这样的输出。 但是Mozilla给了
一个b
(然后它就被挂起了) 而Chrome提供了
b
(并挂起)。 有人能找出我的代码的问题吗?

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