创建自定义setTimeout()函数

时间:2017-06-11 15:50:19

标签: javascript

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()方法?

2 个答案:

答案 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)