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

yizhihongxing

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常量 在JavaScript中,声明一个变量的方式有两种:使用var关键字声明和使用const关键字声明。其中const声明的变量就是JavaScript常量。 常量是指在程序执行过程中其值不可变的变量。一旦用const关键字声明一个变量,就不能再对它进行赋值操作,否…

    JavaScript 2023年6月11日
    00
  • js技巧–转义符”\”的妙用

    来讲讲JavaScript中转义符“\”的妙用吧。 转义符的作用 在JavaScript中,转义符“\”可以在特定情况下表示一些特殊字符或者让某些字符变得有特殊意义。例如,我们可以使用转义符将一些内容输出在HTML中的标签中。 转义符实现HTML中标签的插入 比如说,我们有一个网站,需要在页面上显示如下这段文字: <p>This is a par…

    JavaScript 2023年5月28日
    00
  • 详解JavaScript对数组操作(添加/删除/截取/排序/倒序)

    下面我将详细讲解JavaScript对数组的各种操作方法。 数组的定义 JavaScript中的数组可以包含任意数量的元素,并且可以存储不同类型的数据,如数字、字符串和对象等。在JavaScript中,可以通过以下方式来定义一个数组: // 定义一个数字类型的数组 var nums = [1, 2, 3, 4, 5]; // 定义一个字符串类型的数组 var…

    JavaScript 2023年5月27日
    00
  • Vue文件下载进度条的实现过程

    实现Vue文件下载进度条需要了解以下几个步骤: 发送请求并获取相应数据。 获取响应头中的 Content-Length 值和用于标识下载唯一性的 Etag 或者 Last-Modified 等值作为断点续传的 key。 使用 Blob 对象生成 Blob url 并模拟下载。 读取 Blob 数据的进度值,更新 UI 展示进度条。 下面是具体的实现过程: 1…

    JavaScript 2023年6月11日
    00
  • JS操作xml对象转换为Json对象示例

    下面是JS操作XML对象转换为JSON对象示例的完整攻略。 什么是XML对象和JSON对象? XML(Extensible Markup Language) 是一种文本格式的标记语言,用于存储和传输数据。XML 文件可作为 Web 文档来读取和呈现。 JSON(JavaScript Object Notation) 是一种轻量级的数据格式,它是一种文本格式的…

    JavaScript 2023年5月27日
    00
  • 每天一篇javascript学习小结(Array数组)

    下面我就来详细讲解“每天一篇javascript学习小结(Array数组)”的完整攻略。 一、介绍 本攻略旨在帮助初学者逐步深入了解javascript,重点介绍Array数组的相关内容。每天发布一篇小结,从基础到进阶,逐渐提高学习难度。 二、学习内容 常规操作:Array的创建、增删改查、遍历、排序等; 高阶函数:map、reduce、filter等; 扩…

    JavaScript 2023年6月1日
    00
  • Dialog底部弹出自定义view并且伴随动画弹出和消失

    要实现Dialog底部弹出自定义view并且伴随动画弹出和消失,我们可以使用以下步骤: 自定义Dialog布局:创建一个XML文件来定义我们Dialog的布局,包括我们想要显示的视图。 示例1: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu…

    JavaScript 2023年6月10日
    00
  • 详解JS中的attribute属性

    详解JS中的attribute属性 在JS中,attribute属性是一个非常重要的概念。本文将会对attribute属性进行详细讲解,介绍它的基本概念、用法以及常见的问题。 attribute属性的基本概念 在HTML中,元素可以拥有自己的特定属性,比如<a>元素有href属性,<img>元素有src属性。这些属性可以被JS代码访问…

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