async/await是简化异步代码消费的语法糖,跨模块通信依赖Promise导出与组合;模块应导出返回Promise的异步函数,调用方用await消费,并通过串行或并行方式协调多模块异步逻辑,同时注意错误处理与常见陷阱。

async/await 本身不直接处理模块间通信,它只是让异步代码写起来像同步一样清晰。真正实现跨模块异步逻辑,关键在于模块如何导出、调用和组合 Promise,而 async/await 是在调用端简化消费方式的语法糖。
模块导出异步函数(返回 Promise)
一个模块要参与跨模块异步协作,最基础的方式是把异步操作封装为返回 Promise 的函数,并正常导出。其他模块通过 import 引入后,用 await 消费。
- 导出模块(api.js):
export async function fetchUserData(id) {<br> const res = await fetch(`/api/users/${id}`);<br> if (!res.ok) throw new Error('Failed to fetch');<br> return res.json();<br>}
- 导入模块(profile.js):
import { fetchUserData } from './api.js';<br><br>export async function loadProfile(userId) {<br> try {<br> const user = await fetchUserData(userId);<br> return { ...user, loadedAt: Date.now() };<br> } catch (err) {<br> console.error('Load failed:', err);<br> throw err;<br> }<br>}
立即学习“Java免费学习笔记(深入)”;
组合多个模块的异步调用
跨模块逻辑常需串行或并行协调多个异步步骤,比如先获取用户,再查其权限,最后拉取配置。每个步骤可来自不同模块,用 await 或 Promise.all 组织。
- 串行调用(依赖顺序):
import { fetchUser } from './user.js';<br>import { fetchPermissions } from './auth.js';<br>import { fetchConfig } from './config.js';<br><br>export async function initApp(userId) {<br> const user = await fetchUser(userId);<br> const perms = await fetchPermissions(user.role);<br> const config = await fetchConfig(user.locale);<br> return { user, perms, config };<br>}
- 并行调用(无依赖,提升性能):
export async function initAppFast(userId) {<br> const [user, perms, config] = await Promise.all([<br> fetchUser(userId),<br> fetchPermissions('guest'),<br> fetchConfig('en')<br> ]);<br> return { user, perms, config };<br>}
错误边界与模块级异常处理
跨模块调用中,任一环节 reject 都会冒泡到顶层 await 处。建议在关键集成点做统一捕获,避免未处理的 promise rejection,同时保留各模块自身的错误语义。
- 模块内聚焦业务错误(如网络失败、404):
- 集成层决定重试、降级或展示提示:
export async function safeInit(userId) {<br> try {<br> return await initApp(userId);<br> } catch (err) {<br> if (err.name === 'AbortError') {<br> return { fallback: true };<br> }<br> throw err;<br> }<br>}
避免常见陷阱
async/await 跨模块使用时容易忽略几个细节:
- 不要在模块顶层 await(会导致该模块无法被静态导入);
- 确保所有被 await 的函数确实返回 Promise(普通值会被自动包装,但易掩盖逻辑错误);
- 注意循环依赖:如果 A 模块 await B 的函数,而 B 又同步 import A,就可能出问题;解法是延迟 import 或拆分逻辑;
- Tree-shaking 友好:只导出实际需要的异步函数,避免默认导出巨型对象。
不复杂但容易忽略。
文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/xinjizixun/33822.html