本文最后更新于377 天前,其中的信息可能已经过时,如有错误请发送邮件到1986413837@qq.com
需要设计一个 Pipeline 管道函数,用于控制 360 度展示产品的动画序列,通过管道连接各个动画步骤,使产品以流畅的方式呈现给用户 效果如下

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


initalValue:初始值,作为第一个任务的输入
sequence:一个包含异步函数(或返回 Promise 的函数)的数组
解决思路
(1)初始化参数
let param = initialValue
(2)创建Promise
return new Promise(async (res, rej) => { ... });
(3)遍历任务数组
for (let i = 0; i < sequence.length; i++) {
param = await sequence[i](param);
}
- 循环执行:依次遍历
sequence中的每个函数。sequence[i](param):调用当前任务函数,传入前一个任务的输出值param。await:等待当前任务完成(如果是异步任务),获取其返回值。- 更新
param:将当前任务的返回值赋给param,供下一个任务使用。
(4)返回最终结果
res(param)
关键点
- 顺序执行:
任务严格按数组顺序执行,前一个任务完成后才会开始下一个任务。 - 异步支持:
每个任务可以是同步函数或返回Promise的异步函数,通过await统一处理。 - 错误处理:
- 当前代码中,如果某个任务抛出错误,会直接导致 Promise 被拒绝(
reject),但未显式捕获错误。 - 改进建议:在
await外包裹try-catch,显式调用rej(error)。
- 当前代码中,如果某个任务抛出错误,会直接导致 Promise 被拒绝(
- 参数传递:
每个任务的输出值会作为下一个任务的输入值(类似管道操作)
示例流程
const task1 = (x) => Promise.resolve(x + 1);
const task2 = (x) => Promise.resolve(x * 2);
const task3 = (x) => x - 3;
pipeline(5, [task1, task2, task3])
.then(result => console.log(result)); // 输出: 9
执行步骤:
- 初始值
param = 5。 - 执行
task1(5)→ 返回6,更新param = 6。 - 执行
task2(6)→ 返回12,更新param = 12。 - 执行
task3(12)→ 返回9,更新param = 9。 - 解析 Promise,最终结果
9。
最终代码
const pipeline =(initialValue, sequence) => {
// TODO: 待补充代码
let param = initialValue
return new Promise(async (res, rej)=>
{
for(let i = 0; i < sequence.length; i++)
{
param = await sequence[i](param)
}
res(param)
})
};
代码优化 由于内部已是 async 函数,可直接返回 param,无需 new Promise
const pipeline = async (initialValue, sequence) => {
let param = initialValue;
for (const task of sequence) {
param = await task(param);
}
return param;
};