を使用して、Javascript で単純なバックグラウンド スレッドをモックしようとしていましたsettimeout
。
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()
}
関数へのエントリ ポイントは、id 'note' の div を持つ html ファイルのtest()
本体から呼び出されます。onload
のような出力が得られると期待していましたa b a b a b b
。しかし、Mozilla は与える a b b b
(そしてその後ハングする) 一方で、Chrome は与えるb b b b
(そしてハングする)。誰でも私のコードの問題を理解できますか?