promise串行执行需确保每个异步函数返回promise,并通过then链式调用或async/await顺序等待前一个完成;错误写法会导致并发执行或链中断,正确方式支持错误自动传递与统一捕获。

Promise 串行执行多个异步函数,核心是让下一个 Promise 等待前一个完成后再启动,避免并发或竞态。最常用、最清晰的方式是用 then 链式调用,或用 async/await 按顺序写。
用 then 链式调用逐个传递
每个异步操作返回 Promise,前一个的 then 里返回下一个 Promise,就能自然串行:
- 确保每个函数都返回 Promise(如
fetch、setTimeout包装后的 Promise) - 不要在
then回调里直接调用下一个函数,而要 返回它返回的 Promise - 错误会自动沿链向下传递,可用最后的
catch统一处理
示例:
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
function task1() {
console.log('任务1开始');
return delay(1000).then(() => {
console.log('任务1完成');
return 'result1';
});
}
function task2(data) {
console.log('任务2开始,接收:', data);
return delay(500).then(() => {
console.log('任务2完成');
return 'result2';
});
}
function task3(data) {
console.log('任务3开始,接收:', data);
return delay(800).then(() => {
console.log('任务3完成');
return 'result3';
});
}
// 串行执行
task1()
.then(result1 => task2(result1))
.then(result2 => task3(result2))
.then(result3 => console.log('全部完成:', result3))
.catch(err => console.error('出错:', err));
用 async/await 更直观地写顺序逻辑
把异步函数包装成 async 函数后,可以用 await 像同步代码一样逐行写,可读性更强:
- 每个
await会暂停当前函数,等 Promise settle 后继续 - 注意
await只能在async函数内使用 - 异常可用
try/catch捕获,更贴近传统错误处理习惯
等价写法:
async function runSerial() {
try {
const r1 = await task1();
const r2 = await task2(r1);
const r3 = await task3(r2);
console.log('全部完成:', r3);
} catch (err) {
console.error('出错:', err);
}
}
runSerial();
批量串行执行一组相同类型的异步函数
如果有一组函数(如数组里的 API 调用),想一个接一个执行,可用 reduce 或循环 + await:
-
reduce方式适合纯函数式风格:初始值为Promise.resolve(),每次累加器返回下一个 Promise -
for...of循环配合await更易理解,也方便中途 break 或条件跳过
示例(用循环):
const tasks = [task1, () => task2('dummy'), () => task3('dummy')];
async function runTasksInSeries(taskList) {
let result;
for (const task of taskList) {
result = await task();
}
return result;
}
runTasksInSeries(tasks);
常见误区和注意事项
串行容易写成“伪串行”,关键点在于控制执行时机:
- ❌ 错误:直接调用多个异步函数(如
task1(); task2(); task3();),它们会并发执行 - ❌ 错误:在
then里不返回 Promise(如只写task2()而不写return task2()),链就断了 - ✅ 正确:每个环节都返回 Promise,或用
await显式等待 - ⚠️ 注意:串行会拉长总耗时(各任务时间相加),确认业务是否真需要串行而非并行+聚合
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











