可以代替setTimeout的方案,让轮询更加可靠

1. requestAnimationFrame: requestAnimationFrame主要用于执行动画,它会在浏览器下一次重绘之前调用指定的回调函数

function animateWithRAF(timestamp) {  // 执行动画逻辑  requestAnimationFrame(animateWithRAF);}

requestAnimationFrame(animateWithRAF);

优点:

 1. 与显示器刷新率同步,通常为60fps

 2. 在不可见标签页中会暂停,节省资源

 3. 动画更平滑

2. setInterval + clearInterval:对于需要重复执行的任务,setInterval比多个setTimeout更合适。

const intervalId = setInterval(() => {  

    console.log("每秒执行一次");

}, 1000);

// 停止定时器//

 clearInterval(intervalId);

优点:

1. 代码更简洁

2. 更适合固定间隔的重复任务

3. requestIdleCallback:当浏览器空闲时执行低优先级任务,避免影响关键操作

requestIdleCallback((deadline)=>{

    if(deadline.timeRemaining()>0){

        // 执行非关键任务

    }

},{timeout:2000})

优点:

 1. 充分利用浏览器空闲时间

 2. 可以设置超时保证任务最终会执行

 3. 不阻塞主线程关键操作

4. Web Workers:将耗时任务移至后台线程,避免阻塞主线程

    // main.js

    const worker = new Worker('worker.js')

    worker.onmessage = (event)=>{

        console.log('收到Woker消息:', event.data);

    }

    // worker.js

    setInterval(()=>{

        postMessage('定时任务完成')

     },1000)

5. Promise + async/await: 用Promise包装setTimeout,结合async/await使异步代码更清晰

function delay(ms){

    return new Promise(resolve=>setTimeout(resolve,ms))

}

async function delayTask(){

    console.log('开始')

    await delay(2000)

    console.log('2秒后')

}

delayTask()

优点:

  1. 代码更清晰,避免回调地狱

  2. 更好的错误处理

  3. 便于链式组合多个异步操作

6.Web Animations API :对于动画效果,Web Animations API提供了更高级的控制 

const element = document.querySelector('.box')

const animation = element.animate([

    { transform: ' translateX(0)'},

    { transform: ' translateX(300px)'}

],{

    duration:1000,

    fill:'forwards'

})

animation.onfinish = ()=>console.log('动画完成')

优点:

   1. 声明式API,更易于理解

   2. 内置的暂停、恢复和控制功能 

   3. 比CSS动画和setTimeout更精确

7. Intersection Observer:当元素进入视口时执行代码,比如延迟加载资源或触发动画

const observer = new IntersectionObserver((entries) => {  

    entries.forEach(entry => {    

        if (entry.isIntersecting) {     

             console.log("元素进入视口");     

               // 执行需要的操作   

         } 

     });

});

observer.observe(document.querySelector('.lazy-load'));

优点:

   1. 无需手动计算元素位置

   2. 性能更好,避免滚动事件中大量计算

   3. 适合实现"按需执行"的场景

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容