Promise 实现依赖式流水线任务的核心是链式调用 .then(),通过串行执行与数据传递确保前序结果作为后续输入,需每步返回值或 Promise 以维持链路,错误由 .catch() 统一捕获。

Promise 实现带依赖关系的流水线任务,核心是链式调用 .then(),让前一步的输出作为后一步的输入,同时利用返回新 Promise 控制执行时机和顺序。
依赖式流水线的本质:串行 + 数据传递
每个任务都依赖上一个任务的执行结果(比如上一步返回的 ID,下一步要用它请求详情),不能简单并行 Promise.all。关键点:
- 每个
.then()回调必须返回值(或 Promise),否则下游接不到数据 - 如果返回的是 Promise,后续
.then()会自动等待它 resolve 后再执行 - 错误会沿链向下被最近的
.catch()捕获,适合统一处理中间失败
基础写法:手动链式拼接
适合逻辑清晰、步骤固定的任务流,例如「登录 → 获取用户信息 → 加载权限 → 渲染页面」:
login(username, password)
.then(token => fetchUserInfo(token))
.then(user => fetchPermissions(user.id))
.then(permissions => renderApp(user, permissions))
.catch(err => console.error('流水线中断:', err));
注意:fetchUserInfo 必须返回 Promise,且它的 then 回调里不能丢掉 user——若后续步骤还需用到 token 或 user,可包装成对象传递:
立即学习“Java免费学习笔记(深入)”;
login(username, password)
.then(token => fetchUserInfo(token).then(user => ({ token, user })))
.then(({ token, user }) => fetchPermissions(user.id).then(perm => ({ token, user, perm })))
.then(({ user, perm }) => renderApp(user, perm));
动态/条件流水线:在 then 中决定下一步
某些步骤需根据上一步结果分支(例如:用户是管理员则额外加载配置):
fetchUser(id)
.then(user => {
if (user.role === 'admin') {
return loadAdminConfig().then(config => ({ ...user, config }));
}
return Promise.resolve(user); // 保持类型一致
})
.then(data => renderPage(data));
要点:
- 每个分支都返回 Promise(哪怕用
Promise.resolve()包一层),保证链不断 - 尽量保持各分支返回结构兼容,避免下游反复判断
复用与抽象:封装成可组合函数
把单步任务定义为接受上一结果、返回 Promise 的函数,再用工具函数串起来:
const pipe = (...fns) => (initial) =>
fns.reduce((acc, fn) => acc.then(fn), Promise.resolve(initial));
// 使用
pipe(
username => login(username, '123'),
token => fetchUserInfo(token),
user => fetchPermissions(user.id),
({ user, permissions }) => renderApp(user, permissions)
)('alice').catch(handleError);
这种模式让流水线声明式更强,也便于单元测试每一步函数。


















