蓝桥杯 - 简单 - 产品360度展示

介绍

在电子商务网站中,用户可以通过鼠标或手势交互实现 360 度全方位查看产品,提升用户体验。现在需要你设计一个 Pipeline 管道函数,用于控制 360 度展示产品的动画序列,通过管道连接各个动画步骤,使产品以流畅的方式呈现给用户。

准备

开始答题前,需要先打开本题的项目代码文件夹,目录结构如下:

├── css
├── effect.gif
├── js
│   ├── index.js
│   └── utils.js
└── index.html

其中:

  • css 是样式文件夹。
  • index.html 是主页面。
  • js/index.js 是动画序列代码的 js 文件。
  • js/utils.js 是待补充代码的 js 文件。
  • effect.gif 是页面最终的效果图。

在浏览器中预览 index.html 页面效果如下:

目标

请在 js/utils.js 文件中的 TODO 部分,实现以下目标:

封装一个支持异步的 pipeline 管道函数,能够按顺序执行一系列异步操作,每个异步操作的结果将作为下一个异步操作的输入。

函数参数说明:

  • initialValue:管道的初始值(即 sequence 中第一个函数的参数)。它是整个异步管道的起点。第一个异步步骤将以此值开始,并且后续步骤将在前一步骤的输出基础上进行。
  • sequence:是一个由具有返回值和可以传参的函数组成的数组,函数可以是普通函数也可以是 Promise 函数。每个函数接收前一个步骤的输出(即该函数的参数是上一个函数的执行结果),并返回一个 Promise。这个数组定义了整个管道中的处理步骤和它们的顺序。

函数返回值说明:

  • pipeline 函数返回一个 Promise,这个 Promise 最终解析为整个管道执行完成后的结果。

测试用例如下:

请注意以下用例仅供参考,实际判题时会修改测试用例,请保证代码的通用性。

  • 示例 1:sequence 中都为普通函数
function fn1(data){ return data +'2.开始左转'}function fn2(data){ return data+'3.开始右转'}pipeline('1.动画开始',[fn1, fn2]).then(res => {console.log(res)  })
// 打印结果为:'1.动画开始2.开始左转3.开始右转'

  • 示例 2:sequence 中都为 promise 函数
function fn1(data){ return new Promise(resolve => {resolve(data+'->执行第一个动画')})
}
function fn2(data){ return new Promise(resolve => {resolve(data+'->执行第二个动画')})
}
pipeline('动画开始',[fn1, fn2]).then(res => {console.log(res)
})
// 打印结果为:'动画开始->执行第一个动画->执行第二个动画' 

完成后,点击屏幕触发动画序列,最终效果可参考文件夹下面的 gif 图,图片名称为 effect.gif(提示:可以通过 VS Code 或者浏览器预览 gif 图片)。

规定

  • 请勿修改 js/utils.js 文件外的任何内容。
  • 判题时会随机提供不同参数对 pipeline 函数功能进行检测,请保证函数的通用性,不能仅对测试数据有效。
  • 请严格按照考试步骤操作,切勿修改考试默认提供项目中的文件名称、文件夹路径、class 名、id 名、图片名等,以免造成判题⽆法通过。

判分标准

  • sequence 参数都为普通函数且满足需求正确输出,得 5 分。
  • sequence 参数都为 promise 函数且满足需求正确输出,得 5 分。
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>产品360度展示</title><link rel="stylesheet" href="./css/style.css">
</head><body><h1>产品展示</h1><p class="tip">点击屏幕,360度产品展示</p><div class="computer"><div class="inner"><div class="screen"><div class="face-one"><div class="camera"></div><div class="display"><div class="shade"><div class="computer-screen"><div class="loading-bar"></div><div class="loading-text">正在启动...</div></div></div></div><span>蓝桥云课</span></div><title>Layer 1</title></div><div class="computerbody"><div class="face-one"><div class="touchpad"></div><div class="keyboard"><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key space"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key"></div><div class="key f"></div><div class="key f"></div><div class="key f"></div><div class="key f"></div><div class="key f"></div><div class="key f"></div><div class="key f"></div><div class="key f"></div><div class="key f"></div><div class="key f"></div><div class="key f"></div><div class="key f"></div><div class="key f"></div><div class="key f"></div><div class="key f"></div><div class="key f"></div></div></div><div class="pad one"></div><div class="pad two"></div><div class="pad three"></div><div class="pad four"></div></div></div><div class="shadow"></div></div><script src="./js/utils.js"></script><script src="./js/index.js"></script>
</body></html>

方法一 

/*** @param {*} initialValue 初始值* @param {Array} sequence 由普通函数或 Promise 函数组成的数组* @return {Promise} */const pipeline = (initialValue, sequence) => {// TODO: 待补充代码// 创建 Promist 对象  修改状态为已完成状态let promise = new Promise((resolve,reject)=>{resolve(initialValue);console.log('initialValue,已成功');})// console.log(promise);// sequence.forEach((item)=>{//     // 成功回调//     promise = promise.then(//         value=>{//             console.log(value);//             return item(value)//         }//     )// })    for(let p of sequence){promise = promise.then(value=>{return p(value)})}return promise;
};// 检测需要,请勿删除
try {module.exports = { pipeline };
} catch { }

let promise = new Promise((resolve, reject) => {resolve(initialValue);console.log('initialValue,已成功');
});
  • 这里创建了一个 已完成状态的 Promise,初始值为 initialValue
  • resolve(initialValue) 会立即将这个 Promise 的状态设置为 fulfilled,并将 initialValue 作为解决值。

for...of 循环遍历函数数组

for (let p of sequence) {promise = promise.then(value => {return p(value)})
}
  • for...of 循环:这是 ES6 引入的遍历迭代器的语法,用于遍历 sequence 数组中的每个函数 p
  • 每次迭代中,promise 会被更新为一个新的 Promise,这个新 Promise 是通过调用当前 promise.then(...) 创建的。
  • 在 then 的回调函数中,当前函数 p 会接收前一个 Promise 的结果 value,并返回处理后的新值(或新的 Promise)。
  • 这样,每个函数 p 会在前一个函数执行完毕后执行,形成一个 链式调用,确保函数按顺序执行。
return promise;
  • 循环结束后,promise 已经是一个包含所有函数处理逻辑的 Promise 链。当这个 Promise 被 resolve 时,会按顺序执行 sequence 中的所有函数,并将最终结果传递下去。

for...of 循环的作用

for...of 循环在这里的关键作用是 将函数数组 sequence 转换为一个连续的 Promise 链

  1. 顺序执行sequence 中的函数会按照数组顺序依次执行,每个函数依赖前一个函数的结果。
  2. 动态构建 Promise 链:每次迭代通过 then 方法将当前函数添加到 Promise 链中,确保异步操作的顺序性。
  3. 简洁性:相比传统的 forEach 循环,for...of 语法更简洁,且更符合遍历迭代器的场景。

完整执行流程示例

假设 sequence 是 [func1, func2, func3],则执行流程如下:

  1. 初始 promise 是一个已 resolve 的 Promise,值为 initialValue
  2. 第一次循环(处理 func1):promise 变为 promise.then(value => func1(value))
  3. 第二次循环(处理 func2):promise 变为 promise.then(value => func2(value)),此时 value 是 func1 的返回值。
  4. 第三次循环(处理 func3):promise 变为 promise.then(value => func3(value)),此时 value 是 func2 的返回值。
  5. 最终返回的 promise 会在所有函数执行完毕后 resolve,结果为 func3 的返回值。

方法二

const pipeline = async (initialValue, sequence) => {// TODO: 待补充代码let argument = initialValue;for (let p of sequence) {argument = await p(argument);}return argument;
};

pipeline 是一个 异步函数,用于按顺序执行一系列异步操作(或同步操作),并将前一个操作的结果传递给下一个操作。它接收一个初始值 initialValue 和一个函数数组 sequence,最终返回所有操作处理后的结果。

  • async 关键字表示这是一个异步函数,允许在函数内部使用 await 处理异步操作。
  • initialValue:初始输入值,会被传递给 sequence 中的第一个函数。
  • sequence:一个由多个函数组成的数组,每个函数将按顺序处理前一个函数的结果。
  • argument 变量用于保存每一步处理的中间结果。初始时,它的值为 initialValue
  • for...of 循环:遍历 sequence 数组中的每个函数 p
  • await p(argument)
    • 调用当前函数 p,并将 argument 作为参数传递给它。
    • await 会暂停当前函数的执行,等待 p(argument) 的结果(无论 p 是同步函数还是返回 Promise 的异步函数)。
    • 将 p(argument) 的结果重新赋值给 argument,以便作为下一个函数的输入。
  • 循环结束后,argument 保存了所有函数处理后的最终结果,通过 return 返回。
  • 核心逻辑说明

  • 顺序执行sequence 中的函数会按照数组顺序依次执行,每个函数依赖前一个函数的结果。
  • 异步支持
    • 如果 sequence 中的函数是异步的(返回 Promise),await 会确保等待其完成后再执行下一个函数。
    • 如果函数是同步的,await 会直接返回其结果,不影响执行顺序。
  • 数据传递:每个函数的输出作为下一个函数的输入,形成一条 处理管道

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/42803.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Rust基础】使用LanceDB构建高性能以图搜图服务

简介 最近使用LanceDB构建了一个以图搜图服务&#xff0c;用于相似图片检索&#xff0c;支持以下功能&#xff1a; 搜索 支持向量搜索&#xff0c;查找相似图片支持通过item_id搜索精确搜索 数据管理 支持添加数据、批量导入CSV或JSON数据支持已有数据修改、删除 API 提供HTT…

蓝桥杯备考:模拟算法之排队接水

简单的模拟就行了&#xff0c;把他们的时间排序&#xff0c;时间最少的先上&#xff0c;然后算出每个人的等待时间的平均值 #include <iostream> #include <algorithm> using namespace std; const int N 1e310; int n; double sum; double ret; struct node{int…

zynq7000 + ucos3 + lwip202_v1_2调试过程

1 现在裸机应用上验证lwip 跑起来可能会报错&#xff0c;看下面的链接解决 zynq 网卡Phy setup error问题 zynq 网卡Phy setup error问题-CSDN博客 2 ping同以后&#xff0c;在zynq上添加ucos系统 链接如下&#xff1a; ZYNQ移植uCOSIII_zynq ucos-CSDN博客 3 移植lwip协议…

如何用 Postman 正确传递 Date 类型参数,避免服务器解析错误?

如何在 Postman 中传递 Date 类型参数。调试工具如何模拟发送用户端的当前时间呢&#xff1f; Postman 传递 Date 类型参数教程

卷积神经网络在图像分割中的应用:原理、方法与进展介绍

摘要 图像分割是计算机视觉领域的核心任务之一&#xff0c;旨在将图像划分为具有语义意义的区域。卷积神经网络&#xff08;CNN&#xff09;因其强大的特征提取能力&#xff0c;已成为图像分割的主流方法。本文系统介绍了CNN在图像分割中的关键技术&#xff0c;包括全卷积网络…

VMware Windows Tools 存在认证绕过漏洞(CVE-2025-22230)

漏洞概述 博通公司&#xff08;Broadcom&#xff09;近日修复了 VMware Windows Tools 中存在的一个高危认证绕过漏洞&#xff0c;该漏洞编号为 CVE-2025-22230&#xff08;CVSS 评分为 9.8&#xff09;。VMware Windows Tools 是一套实用程序套件&#xff0c;可提升运行在 VM…

DeepSeek-V3-0324对比OpenAI GPT-4o和Gemini 2.5 Pro

以下是DeepSeek-V3-0324、OpenAI GPT-4o与谷歌Gemini 2.5 Pro模型的更新点及优化对比总结&#xff1a; 1. DeepSeek-V3-0324 开源地址&#xff1a;https://huggingface.co/deepseek-ai/DeepSeek-V3-0324 核心更新与优化 性能提升&#xff1a; 采用6850亿参数MoE架构&#xff…

视频编码器的抉择:x264、x265、libaom、vvenc 对比测试实验

264、x265、libaom、vvenc 对比测试实验 测试机器配置&#xff1a;Apple M1 Pro -16G编码器版本&#xff08;选择自己编译&#xff09;&#xff1a;所有源码都是当前最新更新的状态&#xff0c;此外各类编码具体的编译过程可参考我的相关系列博客。 编码器GitHubx264git clon…

【极速版 -- 大模型入门到进阶】LORA:大模型轻量级微调

文章目录 &#x1f30a; 有没有低成本的方法微调大模型&#xff1f;&#x1f30a; LoRA 的核心思想&#x1f30a; LoRA 的初始化和 r r r 的值设定&#x1f30a; LoRA 实战&#xff1a;LoraConfig参数详解 论文指路&#xff1a;LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE M…

初识MySQl · 内置函数

目录 前言&#xff1a; 日期类函数 字符串函数 数学类函数 其他函数 前言&#xff1a; 在前文的学习我们已经简单了解了部分函数&#xff0c;比如count()函数什么的&#xff0c;今天我们主要是笼统的学习一下MySQL中的函数&#xff0c;仅仅从使用的角度来学习&#xff0c…

Python每日一题(7)

Python每日一题 2025.3.27 一、题目二、分析三、自己源代码四、deepseek答案五、源代码与ai分析 一、题目 question["""编写程序,生成包含20个随机数的列表,然后将前十个元素升序排列,后10个元素降序排列,并输出结果""" ]二、分析 今天本来写了…

一些需要学习的C++库:CGAL和Eysshot

写在前面&#xff1a; 从开始工作到现在&#xff0c;去过多家公司&#xff0c;多个行业&#xff0c; 虽然大部分时间在通信业&#xff0c;但也有其它的行业的工作没有做完&#xff0c;但也很感兴趣。每次想要研究一下时&#xff0c;总是想不起来。 这里写一些信息&#xff0c;…

嵌入式linux系统中对应的文件锁详细实现方法

//文件锁:flock用于对文件加锁或者解锁但是只能产生建议性锁,并且同一个文件不会同时 具有共享锁和互斥锁。 第一:flock函数对应的要素 头文件: #include <sys/file.h> 函数原型:int flock(int fd,int operation) 参数: fd:表示需要加锁文件的文件描述符 operati…

WEB或移动端常用交互元素及组件 | Axure / 元件类型介绍(表单元件、菜单和表格 、流程元件、标记元件)

文章目录 引言I Axure / 元件类型介绍基本元件表单元件菜单和表格流程元件标记元件II Axure 基础Axure / 常用功能介绍Axure / 常用元素实例Axure / 动态交互实例Axure / 常用设计分辨率推荐III Axure / 创建自己的元件库元件库作用元件库的创建及使用引言 I Axure / 元件类型介…

如何排查C++程序的CPU占用过高的问题

文章目录 可能的原因程序设计的BUG系统资源问题恶意软件硬件问题 通常步骤一个简单的问题代码在windows平台上如何排查Windows Process ExplorerWinDBG 在Linux平台如何排查使用TOP GDBPerf 可能的原因 程序设计的BUG 有死循环低效算法与数据结构滥用自旋锁频繁的系统调用&a…

19726 星际旅行

19726 星际旅行 ⭐️难度&#xff1a;困难 &#x1f31f;考点&#xff1a;Dijkstra、省赛、最短路问题、期望、2024 &#x1f4d6; &#x1f4da; import java.util.*;public class Main {static int N 1005;static ArrayList<Integer>[] g new ArrayList[N]; // …

vue3 + ant-design-vue4实现Select既可以当输入框也可以实现下拉选择

近日工作中&#xff0c;遇到一个需求&#xff0c;就是select的有一个前置切换条件&#xff0c;有些条件需要时输入&#xff0c;有些条件需要时下拉选择&#xff0c;但是在切换的时候&#xff0c;后面的这个输入或者选择组件不能闪烁&#xff0c;于是也就只能采用select去实现&a…

Unity UGUI - 六大基础组件

目录 一、Canvas上 1. Canvas&#xff1a;复制渲染子UI控件 2. ✨Canvas Scaler✨&#xff1a;画布分辨率自适应 3. Graphics Raycaster&#xff1a;射线事件响应 4. ✨Rect Transform✨&#xff1a;UI位置锚点对齐 二、Event System上 5. Event System 6. Standalone …

VSCode中使用Markdown以及Mermaid实现流程图和甘特图等效果

前言 Markdown&#xff08;简称md&#xff09;这种文件格式&#xff0c;渐渐盛行起来。有点类似html格式的意思。特别是内嵌的对Marmaid的支持&#xff0c;对流程图、甘特图等的绘制&#xff0c;都非常的方便。 一、安装Markdown的插件 二、创建.md文件 新建一个Markdown文件&…

如何让 history 记录命令执行时间?Linux/macOS 终端时间戳设置指南

引言:你真的会用 history 吗? 有没有遇到过这样的情况:你想回顾某个重要命令的执行记录,却发现 history 只列出了命令序号和内容,根本没有时间戳?这在运维排查、故障分析、甚至审计时都会带来极大的不便。 想象一下,你在服务器上误删了某个文件,但不知道具体是几点执…