JavaScript 异步函数:按顺序等待任务并捕获拒绝
用异步函数模拟任务读取,区分返回 Promise 与得到结果,学习在实际 await 处处理失败并保持输出顺序。
本节目标
用异步函数模拟任务读取,区分返回 Promise 与得到结果,学习在实际 await 处处理失败并保持输出顺序。
环境与运行方法
准备 Node.js 22 或更新版本。把完整代码保存为 lesson.mjs,执行 node lesson.mjs。本组示例使用命令行标准输出,不依赖浏览器 DOM,也不安装第三方包。
核心思路
async 函数总会返回 Promise,await 等待其兑现或将拒绝变成异常。本例没有真实网络请求,采用确定性模拟来学习控制流,因此无需依赖外部服务和计时。
完整示例
async function loadTask(id) {
if (id <= 0) throw new Error("invalid id");
return {id, title: "task-" + id};
}
async function main() {
for (const id of [1, 0, 2]) {
try {
const task = await loadTask(id);
console.log(task.title);
} catch (error) {
console.log("error=" + error.message);
}
}
}
await main();预期输出
task-1
error=invalid id
task-2逐步理解
循环里逐个 await,所以顺序可预测。第二项失败后在本轮 catch 中被报告,循环仍继续处理第三项。若把 try 放在整个循环外,首个异常可能使后续输入不再处理,两种策略需要按任务需求选择。
不要用数组 forEach 搭配 async 回调来假设外层会等待全部任务。需要并发时可考虑 Promise.all 或 allSettled,同时规定并发上限和部分失败策略。并发不自动等于更快,也不能绕过服务限流。
常见问题与边界
- 不等待 Promise 就打印,会得到 Promise 对象而非任务。
- 空 catch 会隐藏失败。
- 网络请求还需要超时和取消,本模拟没有实现这些功能。
动手练习
将输入改为 [0,0,3],预测顺序。
参考答案
依次输出两次 error=invalid id,最后 task-3。每次失败都在当前循环内部处理,互不阻止后续任务。
文章回复
0 条公开回复