JavaScript高级函数应用之分时函数实例分析

JavaScript高级函数应用之分时函数实例分析

分时函数是一种常见的优化技术,它可以在页面实际需要使用某些资源时再进行加载,避免了一开始就加载所有资源,造成不必要的浪费。以下是分时函数的简单实现:

function timeChunk(arr, fn, count) {
  const len = arr.length; // 获取要迭代的数组长度
  let start = 0; // 设置迭代的起始位置
  let timer; // 定义定时器

  function process() {
    let end = start + count; // 计算当前迭代结束的位置
    if (end > len) {
      end = len;
    }
    for (let i = start; i < end; i++) { // 执行循环操作
      fn.call(arr[i], arr[i], i); // Array.prototype.unshift.call(arr,arr[i])
    }
    start = end; // 更新起始位置

    if (start < len) { // 如果还有待处理的元素
      timer = setTimeout(process, 1000); // 创建定时器
    }
  }

  return process;
}

以上分时函数会接收三个参数,分别是要迭代的数组、每一项需要执行的函数和每个时间段需要处理的数量。

实例分析一

现在有一个需求,需要将一个长度为 10000 的数组中的每一项都添加到页面的某个 div 中。使用分时函数可以避免一次性添加产生的页面卡顿现象。

以下是具体实现:

const data = Array.from({ length: 10000 }).map((_, i) => i);
const div = document.createElement("div");
document.body.appendChild(div);

function addNum(num) {
  const p = document.createElement("p");
  p.innerText = num;
  div.appendChild(p);
}

const timeAddNum = timeChunk(data, addNum, 100); // 每隔 100ms 执行 100 次操作
timeAddNum(); // 执行

以上实现会先生成一个长度为 10000 的数组,然后调用 timeChunk 进行分时处理。每隔 100ms 执行一次循环,每次循环会执行 100 次 addNum 函数,将每一项添加到页面上,避免了一次性添加的大量计算和渲染,保证了页面的流畅度。

实例分析二

再来看一个类似的需求,现在有一个需要延迟加载的图片数组,需要先显示默认占位图,当进入可视区域时再加载真实图片,为了避免初次打开页面时一次性加载所有图片导致页面卡顿,可以使用分时函数解决。

以下是具体实现:

const imgData = [
  "https://cdn.jsdelivr.net/npm/imagesloaded@4.1.4/images/1.jpg",
  "https://www.learnku.com/love/uploads/avatar/5974/1512716487.png",
  "http://image.nbd.com.cn/uploads/avatars/784413.jpeg"
];

const imgContainer = document.createElement("div");
imgContainer.setAttribute("id", "img-container");
document.body.appendChild(imgContainer);

function loadImage(url) {
  return new Promise((resolve, reject) => {
    const img = new Image();
    img.onload = () => {
      resolve(url);
    };
    img.onerror = () => {
      reject(`图片加载失败:${url}`);
    };
    img.src = url;
  });
}

function addImg(url, index) {
  loadImage(url)
    .then(() => {
      const img = document.createElement("img");
      img.src = url;
      imgContainer.appendChild(img);
      console.log(`第 ${index + 1} 张图片加载完成:${url}`);
    })
    .catch((err) => {
      console.log(err);
    });
}

const timeAddImg = timeChunk(imgData, addImg, 1); // 每隔 1s 加载一张图片
window.addEventListener("scroll", () => {
  timeAddImg();
});

以上实现先创建一个图片数组,然后根据需要延迟加载的图片数量调用 timeChunk 函数进行分时处理,每隔 1s 加载一张图片,并添加到指定的容器中。当页面滚动时,会触发 timeAddImg 函数,每次添加一张图片,避免了一次性加载所有图片造成的卡顿现象。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript高级函数应用之分时函数实例分析 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JavaScript中的遍历详解(多种遍历)

    JavaScript中的遍历详解(多种遍历) 在JavaScript中,遍历是一种非常重要的操作。遍历可以帮助我们处理数组、对象、Map等数据结构。JavaScript提供了多种遍历方式,每个方式都有其特点和适用场景。在本文中,我们将详细讨论JavaScript中的遍历方式。 for循环 for循环是JavaScript中最基本的遍历方式。它适用于对数组、字…

    JavaScript 2023年5月18日
    00
  • JavaScript中访问id对象 属性的方式访问属性(实例代码)

    JavaScript中访问id对象属性的方式,常用的有两种方法: DOM和jQuery。下面将分别介绍这两种方法的实现。 使用DOM访问id对象属性 DOM(Document Object Model) 是一种树状结构,它把HTML文档看作是一个由节点和对象组成的树形结构,通过DOM可以对HTML文档进行访问和操作。在DOM上访问id对象属性,可以使用doc…

    JavaScript 2023年5月27日
    00
  • 小程序中实现excel数据的批量导入的示例代码

    下面是关于“小程序中实现excel数据的批量导入的示例代码”的完整攻略。 准备工作 在进行excel数据批量导入前,我们需要做一些准备工作:1. 准备一个excel文件,并将需要导入的数据按照一定的顺序保存在sheet表格中。比如我们要导入学生的姓名、年龄、班级等信息,则需将这些信息对应的字段分别保存在不同的列中;2. 借助开发者工具,在小程序中新建一个页面…

    JavaScript 2023年6月10日
    00
  • 2022发布ECMAScript新特性盘点

    2022发布ECMAScript新特性盘点 ECMAScript是JavaScript的标准化规范,随着JavaScript在各种领域的广泛应用,ECMAScript的发展也越来越快速。2022年发布的ECMAScript新特性是JavaScript开发者需要重点关注的内容之一。本文将详细讲解这些新特性并提供示例说明。 BigInt BigInt是一种新的基…

    JavaScript 2023年5月27日
    00
  • ajax前台后台跨域请求处理方式

    当浏览器端发起跨域请求时,如果请求头中不包含适当的跨域示意标识,目标服务器会拒绝该请求,所以前端需要先向服务器获取跨域请求准许,然后再发起跨域请求。这个过程涉及到的技术就是 ajax 前台后台跨域请求处理方式。 下面是处理跨域请求的完整攻略和两个示例: 1. 服务器端处理方式 如果前台请求是 GET 请求,服务器端需要处理跨域请求,在 HTTP 响应头中添加…

    JavaScript 2023年6月11日
    00
  • 深入理解JavaScript系列(31):设计模式之代理模式详解

    深入理解JavaScript系列(31):设计模式之代理模式详解 概述 代理模式是一种结构型模式,其中一个对象充当另一个对象的接口,以控制对该对象的访问。 这种类型的设计模式属于结构模式,它对对象进行组合,以提供新的功能,同时使代码更易于维护。 在 JavaScript 中,代理模式允许我们在运行时动态地创建对象并控制其行为。 代理可以隔离对实际对象的访问,…

    JavaScript 2023年6月11日
    00
  • JavaScript setInterval()与setTimeout()计时器

    JavaScript setInterval()和setTimeout()计时器 在 JavaScript 中,我们可以使用 setInterval() 和 setTimeout() 两个内置函数来创建计时器,控制代码执行的时间间隔。 setInterval() setInterval() 函数可以重复执行一个函数,并且每隔一定的时间间隔进行一次执行。函数接…

    JavaScript 2023年5月27日
    00
  • javascript中内置对象Math的介绍及用法案例

    下面是关于“javascript中内置对象Math的介绍及用法案例”的完整攻略。 什么是Math对象 Math对象是一个内置对象,提供了许多数学上的方法和常数。 常用方法 下面是一些常用的Math对象的方法: Math.abs() Math.abs()方法返回一个给定数字的绝对值。该方法接受一个参数num,可以是任何数字类型,如整数、浮点数或负数。 例如: …

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部