async 标记函数返回 Promise,在函数内用 async 标记函数返回 Promise,在函数内用 async 标记函数返回 Promise,在函数内用
Node.js 词条目录
前端Wiki/Node.js/深入/异步编程与错误处理

Promise 与 async/await

async/await 是异步编程的现代标准:用 async 标记函数返回 Promise,在函数内用 await 等待结果。代码读起来像同步,但底层完全异步、不阻塞事件循环。

规则:await 只能在 async 函数里用(顶层 await 需 ESM);await 后面跟 Promise,等它 resolve 才继续;它让 try/catch 重新可以捕获异步错误了——这是相比 then/catch 的最大便利。

  • async 函数永远返回 Promise;非 Promise 返回值会被包装
  • await 暂停当前函数(不阻塞进程),类似“读到一半先让出”
  • 配合 try/catch 同时捕获同步与异步错误,代码骨架最清晰
JS
const fs = require('fs');
const fsp = fs.promises;

// 串行读取:await 依次等待,代码却是一条直线
async function loadAll() {
  try {
    const user = await fsp.readFile('./user.json', 'utf8');
    const perm = await fsp.readFile('./perm.json', 'utf8');
    return { user, perm };
  } catch (e) {
    console.error('读取失败:', e.message);
    return null;
  }
}

// 并行:互不依赖的异步用 Promise.all 一起跑,快得多
async function loadParallel() {
  const [user, perm] = await Promise.all([
    fsp.readFile('./user.json', 'utf8'),
    fsp.readFile('./perm.json', 'utf8'),
  ]);
  return { user, perm };
}

(async () => {
  console.log(await loadAll());
  console.log(await loadParallel());
})();
本节要点async/await 用同步外形写异步逻辑;互相不依赖的异步操作务必 Promise.all 并行。