DevCN
菜单
全部文章快讯开发科技深度热点

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。每次失败都在当前循环内部处理,互不阻止后续任务。

下载推广海报

文章推广海报

《JavaScript 异步函数:按顺序等待任务并捕获拒绝》完整推广海报
DISCUSSION

文章回复

0 条公开回复
未登录回复需要审核后公开
还没有回复,欢迎参与讨论。