首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用setTimeout实现setInterval

使用setTimeout实现setInterval
EN

Stack Overflow用户
提问于 2018-06-03 17:41:54
回答 3查看 3.1K关注 0票数 1

使用setTimeout实现setInterval的最佳方法是什么?

考虑到被模拟的setInterval应该能够被“清除”。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-03 17:42:51

下面的代码使用setTimeout创建了setInterval的模拟实现

代码语言:javascript
复制
function interval(cb, ms){
  var a = {
    clear : function(){
      clearTimeout(a.timer)
    }
  };
  (function run(){
    cb();
    a.timer = setTimeout(run, ms);
  })();
  
  return a;
}


var myInterval_1 = interval(()=>{ console.log(1) }, 1000); // create an "interval" 
var myInterval_2 = interval(()=>{ console.log(2) }, 1000); // create another "interval" 

// clear the first interval
setTimeout(()=>{ myInterval_1.clear() }, 4000)

票数 0
EN

Stack Overflow用户

发布于 2018-06-04 03:03:42

为了准确地模拟setInterval,ons也必须模拟clearInterval:

代码语言:javascript
复制
{
  const intervals = new Map();

  function setInterval(fn, time, context, ...args) {
    const id = Math.floor(Math.random() * 10000);
    intervals.set(id, setTimeout(function next() {
       intervals.set(id, setTimeout(next, time));
       fn.apply(context, args);
    }, time));
    return id;
  }

  function clearInterval(id) { 
    clearTimeout(intervals.get(id));
  }
}

您可以像往常一样使用它:

代码语言:javascript
复制
 const interval = setInterval(console.log, 100, console, "hi");

clearInterval(interval);
票数 4
EN

Stack Overflow用户

发布于 2019-01-29 07:53:26

我有一个没有递归的基于promise的解决方案:)

代码语言:javascript
复制
function setInterval1(fn, time) {
    let check = { check: true };
    (async function () {
        for (let i = 0; i < Number.POSITIVE_INFINITY && check.check; i++) {
            await new Promise((resolve) => {
                setTimeout(() => { fn(); resolve(true); }, time);
            });
        }
    })();
    return check;
}

let check = setInterval1(() => console.log('hi'), 1000);

function clearInterval1(check) {
    check.check = false;
}

setTimeout(() => { clearInterval1(check) }, 4000)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50665051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档