2017-06-11 60 views
0
var td = { 
setTimeout: function(callback, ms){ 
var dt = new Date(); 
    var i = dt.getTime(), future = i+ms; 
    while(i<=future){ 
     if(i === future){ 
     callback(); 
     } 
     // i = dt.getTime(); 
     i++; 
    } 
} 
}; 
td.setTimeout(function(){ 
    console.log("Hello"); // executes immediately 
}, 3000); 

这种方法的问题是,在同时块我的i值设置为i + 1我认为结束时,应设置为当前时间戳(dt.getTime())那么,future(回调函数应该执行的时间戳值)可以与当前时间戳进行比较,该值是i的值。创建自定义的setTimeout()函数

但是,当我注释掉i++并取消这一行:

I = dt.getTime();

并运行脚本,浏览器冻结。有没有办法创建一个setTimout()方法,可以达到与window.setTimeout()相同的目的?

+1

它是不是真的可以模拟'setTimeout'用户代码的土地,因为JavaScript不公开任何API直接函数添加到事件队列。反正...什么实际上是你的问题? –

+1

你应该明白,即使你修复了无限循环问题,眉毛ser仍然会锁定。这是因为循环会阻止任何其他内容被执行,直到它终止。 –

+0

看看[**这个答案**](https://stackoverflow.com/a/41814108/6647153)或多或少的类似问题。 –

回答

1

与您的代码的问题是,dt.getTime()总是返回相同的值(即当DT对象的创建时间。为了使这个工作,你需要做之前

dt = new Date(); 

您设置

i = dt.getTime(); 
+0

这正是他在做的。 –

+0

@ibrahimmahrir:不,不在循环中。 –

+0

他只做一次,因为他打电话setTimeout ..所以休息条件不会改变,他停留在无尽的循环 –