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);
这种方法的问题在于,在while块结束时,我将i
的值设置为i + 1
,我认为应将其设置为当前时间戳({{1这样,dt.getTime()
(回调函数应该执行的时间戳值)可以与当前时间戳进行比较,当前时间戳是future
的值。
但是,当我发表评论i
并取消评论此行时:
i = dt.getTime();
并运行脚本,浏览器冻结。有没有办法创建一个与i++
具有相同目的的setTimout()
方法?
答案 0 :(得分:1)
您的代码存在的问题是,dt.getTime()始终返回相同的值(即创建dt对象的时间。要使其正常工作,您需要执行
dt = new Date();
之前设置
i = dt.getTime();
答案 1 :(得分:0)
看哪.. setTimeout 不是同步的 >:D
function timeout(fn,n){
(async()=>{
n=n||0; var time=Date.now()+n
await new Promise(r=>r()) //asynchronous even if n is 0
while(Date.now()<time){
await new Promise(r=>r())
}
fn()
})()
return true
}
//demonstration
timeout(()=>console.log(3),200)
timeout(()=>console.log(2),20)
console.log(1)