我的编程空间,编程开发者的网络收藏夹
学习永远不晚

页面中实现setInterval和setTimeout效果示例详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

页面中实现setInterval和setTimeout效果示例详解

前言

昨天面试一家公司,面试官问我,如何在不使用setTimeout和setInterval在页面中实现setInterval和setTimeout效果,我:????。

后来我仔细想了一下,思路就是获取时间戳,然后用递归判断实现。那么思路是这样,下面就代码实现一下吧。

setTimeout的实现

function setTimeout_(dalay) {
  // 第一次的时间戳
  const timestampFirst = Date.now()
  // 返回一个promise对象
  return new Promise(reslove => {
    // 操作
    function handle() {
      // 每一次的时间戳
      const timestamp = Date.now()
      // 当时间戳减去后大于延迟时间
      if ((timestamp - timestampFirst) >= dalay) {
        // 成功回调
        reslove()
      } else {
        // 递归
        handle()
      }
    }
    // 初次调用
    handle()
  })
}
setTimeout_(10).then(() => {
  alert(10)
})

上面的代码看似没有毛病,但是运行后发现,setTimeout_()里面的值设置小一点没有问题(比如2、3),但是一旦超过,就会造成堆栈溢出,乃至报错。

解决堆栈溢出方法

下面隆重介绍一个人,蹦床函数(trampoline)

蹦床函数(trampoline)就是将 递归执行 转为 循环执行
执行的都是同样的步骤,只是反复执行,就好像在蹦床,跳上去,掉下来,在跳上去…

  • 蹦床函数的实现:
function trampoline(f){
  while(f && f instanceof Function && falg){
   f = f()
  }
  return f
}

它接受一个函数f作为参数。只要f执行后返回一个函数,就继续执行。注意,这里是返回一个函数,然后执行该函数,而不是函数里面调用函数,这样就避免了递归执行,从而就消除了调用栈过大的问题

最终实现

// 定时器
function setTimeout_(dalay) {
  // 第一次的时间戳
  const timestampFirst = Date.now()
  // 返回一个 Promise 对象
  return new Promise(reslove => {
    // 具体操作
    function handle() {
      // 每一次的时间戳
      const timestamp = Date.now()
      // 当时间戳减去后大于延迟时间
      if ((timestamp - timestampFirst) >= dalay) {
       // 成功回调
        reslove()
      } else {
       // 不满足条件继续调用
        return handle
      }
    }
    // 调用蹦床函数、将递归变为循环
    trampoline(handle)()
  })
}
// 蹦床函数
function trampoline(f){
  while(f && f instanceof Function){
    f = f()
  }
  return f
}
setTimeout_(1000).then(res => {
  alert(1000)
})

以上的代码,就能实现效果了

思路:定义一个函数,参数为延迟时间,调用时记录一个第一次时间戳,然后里面返回一个Promise对象,再里面有一个闭包,是执行递归操作的函数,这个函数里面做的事就是记录每一次的时间戳,然后减去第一次的时间戳,得出的就是间隔时间,跟规定的间隔时间作比较,如果大于的话,就调用Promise成功回调。再下面就是将递归转为循环,防止堆栈溢出。最后调用

setInterval的实现

这个跟setTimeout差不多,区别就是这个需要每隔一段时间执行代码,并且需要手动清除

// 如果 falg 为 false就不会继续执行循环操作
let falg = true
// 蹦床函数技术,利用循环
function trampoline(f){
  while(f && f instanceof Function && falg){
    f = f()
  }
  return f
}
// 计时器
function setInterval_(f, dalay) {
  // 第一次的时间戳
  let timestampFirst = Date.now()
  // 操作
  function handle() {
    // 每一次的时间戳
    const timestamp = Date.now()
    if ((timestamp - timestampFirst) >= dalay) {
      // 间隔时间到了就重置第一次时间戳
      timestampFirst = Date.now()
      // 调用函数
      f()
    }
    return handle
  }
  trampoline(handle)()
}
let count = 0
// 调用
setInterval_(function() {
  count ++
  if (count === 3) {
    falg = false
  }
  console.log(count)
}, 1000)

上面这个代码我定义的是在控制台输入1、2、3,然后关闭

思路:同样是判断时间戳,但是跟setTimeout不一样的是每次执行里面的函数需要重置时间,达到每次执行的效果。并且在蹦床函数里面的while增加一个判断,用来控制计时器的停止。

总结:这种东西了解一下,以后当个吹牛逼资本就可以了,毕竟这性能嘛.....

以上就是页面中实现setInterval和setTimeout效果示例详解的详细内容,更多关于setInterval setTimeout页面效果的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

页面中实现setInterval和setTimeout效果示例详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JS实现微信播音效果示例详解

这篇文章主要为大家介绍了JS实现微信播音效果示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-02-21

Android应用中利用ViewPager实现多页面滑动切换效果示例

1、添加android support包 因为上面的几个类都是在android support包中才提供,我们先添加包。 在Eclipse->Window->Android SDK Manager,选择列表中Extras->Android
2022-06-06

Android 中使用 ViewPager实现屏幕页面切换和页面轮播效果

之前关于如何实现屏幕页面切换,写过一篇博文《Android中使用ViewFlipper实现屏幕切换》,相比ViewFlipper,ViewPager更适用复杂的视图切换,而且Viewpager有自己的adapter,这也让其适应复杂对象,实
2022-06-06

Unity实现卡片循环滚动效果的示例详解

这篇文章主要为大家详细介绍了如何利用Unity实现卡片循环滚动的效果,文中的实现步骤讲解详细,具有一定的借鉴价值,需要的可以参考一下
2022-12-09

Python中执行MySQL结果限制和分页查询示例详解

目录python mysql 限制结果示例 1: 获取您自己的 Python 服务器示例 2: 从位置 3 开始,返回 5 条记录LEFT JOINRIGHT JOINPythowww.cppcns.comn MySQL 限制结果限制结果
Python中执行MySQL结果限制和分页查询示例详解
2023-11-14

wow.js实现炫酷的页面滚动伴随动画示例详解

这篇文章主要为大家介绍了wow.js实现炫酷的页面滚动伴随动画示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-02-01

Android App中实现简单的刮刮卡抽奖效果的实例详解

主要思想: 将一个view设计成多层:背景层,含中奖信息等; 遮盖层,用于刮奖,使用关联一个Bitmap的Canvas 在该Bitmap上,使用它的canvas.drawPath的api来处理 手势滑动(类似刮奖的动作) 使用paint.s
2022-06-06

Android实现在列表List中显示半透明小窗体效果的控件用法详解

本文实例讲述了Android实现在列表List中显示半透明小窗体效果的控件用法。分享给大家供大家参考,具体如下: Android 在列表List中显示半透明小窗体效果的控件,多的不多直接上代码,要说的都在注释里了:import com.hi
2022-06-06

编程热搜

目录