前端---场景题

news/2024/11/8 9:13:12/
  1. 一个下拉框 200条数据 怎么优化 (默认展示10条)
  2. 60个请求(限制最多同时请求6个)请求并行方案
  3. 原生拖拽方案及实现细节(mouseMove、drag,drop) ✅ (有待继续完善)
  4. 数组遍历方法 哪个快
  5. 手写函数实现数组 。[12, 3, 24, 1, 932, 6423]按照首位排序
  6. 手写实现add函数 满足 add(1)(2)(3)() 返回 6

2、60个请求(限制最多同时请求6个)请求并行方案

  <script>/*** 此问题目的为了解决类似http请求的并发量过大导致内存可能溢出的问题。1、同时执行任务数6个2、每执行一次就需要将请求 --3、当前任务队列执行完成之后,执行下一个4、所有任务添加到队列后,自动开始执行任务*/debuggerfunction concurrentPoll() {this.tasks = []; // 任务队列this.max = 10; // 最大并发数// 函数主体执行完后立即执行,由于setTimeout是macrotask(宏任务),promise是microtask(微任务)// 所以,addTask方法添加的函数会优先执行setTimeout(() => {this.run()}, 2000)}concurrentPoll.prototype.addTask = function (task) { // 原型添加任务方法this.tasks.push(task)}concurrentPoll.prototype.run = function () { // 原型任务运行方法if (this.tasks.length == 0) { // 判断是否还有任务return}const min = Math.min(this.tasks.length, this.max); // 取任务个数与最大并发数最小值console.log('min', min)for (let i = 0; i < min; i++) {this.max--; // 执行最大并发递减const task = this.tasks.shift(); // 从数组头部取任务task().then((res) => { // 重:此时可理解为,当for循环执行完毕后异步请求执行回调,此时max变为0debuggerconsole.log(res)console.log('res', this.max) // 0 1 2 3 4 5 6 7 8 9 / 10 11 12}).catch((err) => {console.log(err)}).finally(() => { // 重:当所有请求完成并返回结果后,执行finally回调,此回调将按照for循环依次执行,此时max为0.debuggerthis.max++; // 超过最大并发10以后的任务将按照任务顺序依次执行。此处可理解为递归操作。// 0++ = 1 0++ = 1 0++ = 1this.run(); //               1-- = 0  1-- = 0  1-- = 0// tasks.length  2        1        0console.log('finally', this.max)// 0 0 0 1 2 3 4 5 6 7之后执行.then,执行完之后再执行 8 9 10})}}const poll = new concurrentPoll(); // 实例for (let i = 0; i < 13; i++) { // 数据模拟poll.addTask(function () {return new Promise(function (resolve, reject) {// 一段耗时的异步操作resolve(i + '成功') // 数据处理完成// reject('失败') // 数据处理出错})})}</script>

3、原生拖拽方案及实现细节(mouseMove、drag,drop)

<script>
export default {name: 'drag',data() {return {afterData: ['', '', '', ''],beforeData: ['花', '好', '月', '圆'],resData: [['花', '好', '月', '圆'],['百', '年', '好', '合'],['一', '帆', '风', '顺']],beforeId: '',dragId: '',downMoveX: 0, // 按下的 div 移动的坐标downMoveY: 0,mouseX: 0, // 鼠标在 div中 x坐标mouseY: 0,}},mounted() {this.dragId = document.getElementById('drag')this.oldBlanks = document.querySelectorAll('.after')console.log('oldBlanks', this.oldBlanks)console.log('drag-offsetTop', this.dragId.offsetTop)},methods: {// handleDarg() {// },handleBeforeDown(e, id) {this.beforeId = document.getElementById(id)console.log('eeee->', e)const { offsetX, offsetY } = ethis.mouseX = offsetXthis.mouseY = offsetYthis.downMoveX = this.beforeId.offsetLeft     this.downMoveY = this.beforeId.offsetTopconsole.log('this.downMoveY',  this.downMoveY)const setDiv = this.beforeId.stylesetDiv.background = 'pink'setDiv.position = 'absolute'setDiv.top = this.downMoveY + 'px'setDiv.left = this.downMoveX + 'px'setDiv.width = '98px'setDiv.height = '98px'this.beforeId.addEventListener('mousemove', this.handleBeforeMove)console.log('beforeId', this.beforeId)},handleBeforeMove(e){console.log('9023', e)console.log('232', window.event)const { offsetX, offsetY, clientX, clientY } = elet moveY = clientY - this.dragId.offsetTop - this.mouseYlet moveX = clientX - this.dragId.offsetLeft - this.mouseXconsole.log('moveY-->', moveY)console.log('moveX-->', moveX)// 2、设置边界if (moveY <= 0) {moveY = 0} else if (moveY >= 500) {moveY = 500}if (moveX <= 0) {moveX = 0} else if (moveX >= 500) {moveX = 500}// 1、开始移动距离this.beforeId.style.top = moveY + 'px'this.beforeId.style.left = moveX + 'px'},handleBeforeUp() {if (this.beforeId) {this.handleDIvAdsorption()// this.beforeId.style = {}this.beforeId.removeEventListener('mousemove', this.handleBeforeMove)this.beforeId = ''this.mouseX = 0this.mouseY = 0this.downMoveX = 0  this.downMoveY = 0}},// 拖动的div,查看吸附哪个空白div上handleDIvAdsorption() {const whiteDivArea = this.oldBlanks[0].offsetWidth * this.oldBlanks[0].offsetHeightfor (let i = 0;i < this.oldBlanks.length; i++) {if (this.afterData[i] !== '') {continue;}const oldDiv = this.oldBlanks[i]const { offsetTop, offsetLeft } = this.beforeIddebuggerlet verticalLength = oldDiv.offsetHeight - ( offsetTop - oldDiv.offsetTop )console.log('verticalLength', verticalLength)let transverseLength = 0if (offsetLeft >= oldDiv.offsetLeft) {transverseLength = oldDiv.offsetWidth - (offsetLeft - oldDiv.offsetLeft)} else {transverseLength = oldDiv.offsetWidth - (oldDiv.offsetLeft - offsetLeft)}if (verticalLength > 0 && transverseLength > 0) {const occupiedArea = transverseLength * verticalLengthconsole.log('transverseLength', transverseLength)if (occupiedArea / whiteDivArea >= 0.5 ) {console.log('在指定区域,可以吸附')this.handleSetMouseDiv(oldDiv.offsetTop, oldDiv.offsetLeft)this.afterData.splice(i, 1, this.beforeId.innerText)return}console.log('不可以吸附')this.handleSetMouseDiv(this.downMoveY, this.downMoveX)}}},handleSetMouseDiv(top, left){const setDiv = this.beforeId.stylesetDiv.top = top + 'px'setDiv.left = left + 'px'}}
}
</script>

http://www.ppmy.cn/news/588365.html

相关文章

个人用计算机配置清单,电脑配置单这么写?教你写一份合理的电脑配置清单

IT杂志社干货分享 IT杂志社:专注电脑、手机干货分享,欢迎点击右上角关注。 今天聊一下电脑配置单这么写?在开始写配置清单之前,一定要清楚自己的需求和预算。 最简单的决定就是直接选择当下的顶级配置,关于需求和性能之间的关系,请看《漫谈个人电脑的未来》。 写配置清单…

【adb 命令】

1.ADB概念 ADB&#xff0c;全名 Android Debug Bridge&#xff0c;是 Android 提供的一个通用的调试工具&#xff0c;是一个 C/S 架构的命令行工具&#xff0c;通过这个工具&#xff0c;使得我们的 PC 能够和 Android 设备来进行通信。 1.1 ADB的工作原理&#xff1a; adb 主要…

什么是α测试β测试和灰度测试?

吃软件测试这碗饭的&#xff0c;如果基础理论都不懂&#xff0c;谈何长久&#xff1f; 欢迎来学习本系列&#xff0c;基础理论比较枯燥&#xff0c;这也是为什么现在很少人掌握的主要原因。热饭尽量用浅显易懂 生动的例子 来帮助大家学习基础理论&#xff0c;所以请耐心看完此系…

网络数码相框 精彩尽在分享

——WIZnet产品应用小例30&#xff1a;网络数码相框 数码相框&#xff1a;目前家中使用的数码相框&#xff0c;大多是通过读取储存卡展示相片&#xff0c;未来的发展趋势&#xff0c;也许根本就不需要储存卡&#xff0c;只需要一个以太网芯片&#xff0c;就可将通过网络传输过来…

[USB芯片]基于CH579M的MINI版数码相框

从最初得到CH554开发板起&#xff0c;就期待着有一块能读取U盘的开发板&#xff0c;后来CH579M EVT开发板出来&#xff0c;可惜没能如愿&#xff0c;于是就将力量集中在CH579M- R1开发板身上。 尽管CH579M- R1较之CH579M EVT的外设相差很多&#xff0c;当还是能够通过它来实现…

数码相框设计-系统框架与环境

当我们需要设计一款产品时&#xff0c;一般分为四个步骤&#xff1a; abcd弄清需求设计框架编写代码测试产品 框架是整个流程最难也是最重要的部分&#xff0c;在此主要来介绍框架与开发的环境来对数码相框有个大体的认识 一、需求 ① 上电&#xff0c;lcd显示一幅图片。 …

9、数码相框编写程序之框架分析

文章目录 1、框架分析1.1、数码相框的整体框架1.2、页面管理模块框架1.3、抽象出结构体 2、框架编写 上一节&#xff1a;8、数码相框之libjpeg的使用 下一节&#xff1a;10、数码相框编写程序之图标显示 1、框架分析 1.1、数码相框的整体框架 我们最终要实现的功能如上图&am…

linux-数码相框

平台&#xff1a;s3c2440 内核版本&#xff1a;linux-2.6.22.6 源码位置&#xff1a;https://github.com/yogach/digital_photo 描述&#xff1a;本数字相框实现共实现了主页面、文件浏览页面、图片模式浏览页面、图片联播页面、设置页面、联播模式时间间隔设置页面。图片部分…