IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> [js] Promise.all 多接口请求、递归节点查找、渲染性能代码优化 -> 正文阅读

[JavaScript知识库][js] Promise.all 多接口请求、递归节点查找、渲染性能代码优化

说明:可直接cv代码到控制台 F12 运行

一、Promise.all 多接口请求,所有请求完成后打印所有请求结果

// 定义接口路径
const url = [100, 200, 300, 400, 500, 600, 700, 800, 900, 2000]

// 模拟请求
function request(u) {
	return new Promise(resolve => {
		setTimeout(() => {
			if (u === 500 || u === 700) {
				// 模拟请求报错时,防止 Promise.all 执行中断
				// 使用 resolve 而不使用 reject
				resolve('error')
			} else {
				// 成功时
				resolve(u)
			}
		}, u)
	})
	// return axios.get(url)
}

// Promise.all 等待所有都完成
async function allRequest(urls) {
	const res = await Promise.all(urls.map(u => {
		return request(u)
	}))
	const newRes = res.filter(r => r !== 'error')
	// Promise.all 等待请求全部完成才输出结果
	console.log(res)
	console.log(newRes)
}

// 调用
allRequest(url)

二、递归节点查找

// 模拟树
const treeData = [
  {
    name: "节点1",
    children: [
      {
        name: "节点1-1",
        children: [],
      },
      {
        name: "节点1-2",
        children: [
          {
            name: "节点1-2-1",
            children: [],
          },
        ],
      },
    ],
  },
  {
    name: "节点2",
    children: [
      {
        name: "节点2-1",
        children: [],
      },
    ],
  },
];

// 递归
function fn(arr, name, callback) {
	arr.forEach(v => {
		if (v.name === name) callback(v)
		if (v.children) fn(v.children, name, callback)
	})
}

// 执行函数
fn(treeData, '节点1-2-1', res => {
	console.log(res)
})

三、渲染性能代码优化

1、代码优化

// 初始化 dom
const demo = document.createElement('div')
demo.setAttribute('id', 'demo')
document.body.append(demo)

// 原代码
const el = document.querySelector('#demo');
for (let i = 0; i < 1000; i++) {
	el .innerHTML += `<option value="${i}">第${i}个选项</option>`;
}

// 优化后
const el = document.querySelector('#demo');
let htmls = ''
for (let i = 0; i < 1000; i++) {
	htmls += `<option value="${i}">第${i}个选项</option>`;
}
el.innerHTML = htmls

2、再次优化,防抖?懒加载??

// 初始化 dom
const demo = document.createElement('div')
demo.setAttribute('id', 'demo')
document.body.append(demo)

// 定义变量
let htmls = ''
let oldEl = ''
const el = document.querySelector('#demo');

// 防抖(只是在最后一次事件结束后才触发一次函数)
function fd(callback, delay) {
	let time = null
	return () => {
		clearTimeout(time)
		time = setTimeout(callback, delay)
	}
}

// 懒加载
function lazy(callback, oldEl, noDataLength = 150) {
	if (oldEl.length >= noDataLength) {
		if (!document.getElementById('no-data')) {
			const div = document.createElement('div')
			div.setAttribute('id', 'no-data')
			div.innerText = '没有更多数据了...'
			el.appendChild(div)
		}
		return false
	}
	const st = document.documentElement.scrollTop // 滚动条滚动距离
	const cH = document.documentElement.clientHeight // 可视区高度
	const sH = document.body.scrollHeight // 浏览器所有内容高度
	if (st + cH > sH) callback()
}

// 初始化模拟数据
window.addEventListener('load', () => {
	for (let i = 0; i < 50; i++) {
		htmls += `<option value="${i}">第${i}个选项</option>`;
	}
	el.innerHTML = htmls
})

// 使用防抖 + 懒加载
window.addEventListener('scroll', fd(() => {
	lazy(() => {
		oldEl = document.querySelectorAll('#demo option');
		for (let i = 0; i < 50; i++) {
			let option = document.createElement('option')
			option.setAttribute('value', oldEl.length + i)
			option.innerText = `${oldEl.length + i}个选项`
			el.appendChild(option)
		}
	}, oldEl, 100)
}, 500))
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-11 16:21:48  更:2022-05-11 16:22:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:54:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码