2026-01-22 17:33:43
async/await 是 JavaScript 中处理异步操作的现代语法,它基于 Promise,但提供了更接近同步代码的书写方式,避免了回调地狱和复杂的 Promise 链。以下是实现异步加载效果的核心方法与示例。
核心实现步骤创建 sleep 函数该函数返回一个 Promise,在指定时间后 resolve,用于模拟异步延迟。
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));定义异步加载函数使用 async 声明函数,内部通过 await 暂停执行,实现分步加载效果。
async function OSLoad(OS = "", loadingTimeSeconds = 10) { const symbols = ["", "|", "/", "-"]; // 加载动画符号 let index = 0; const totalSteps = loadingTimeSeconds * 4; // 每秒4步(250ms/步) for (let step = 0; step < totalSteps; step++) { process.stdout.write(`${symbols[index]} Loading ${OS}r`); // r 回车不换行 index = (index + 1) % 4; // 循环切换符号 await sleep(250); // 暂停250ms } process.stdout.write(`${OS} is loaded..n`); // 加载完成}模拟控制台输出在浏览器环境中模拟 process.stdout.write,实现动态文本更新。
const pre = document.querySelector('pre');const consoleBuffer = Array(10).fill(' '); // 模拟控制台缓冲区let position = 0;function consoleWrite(text) { for (const char of text) { if (char === 'n') position = 0; // 换行时重置位置 else if (position < consoleBuffer.length) { consoleBuffer[position++] = char; // 逐字符写入 } } pre.innerText = consoleBuffer.join(''); // 更新显示}// 模拟 Node.js 的 process.stdoutwindow.process = { stdout: { write: consoleWrite } };启动加载过程调用异步函数,传入操作系统名称和加载时间。
OSLoad('Fake OS 4.01', 3); // 加载3秒await 必须在 async 函数中使用直接在顶层作用域使用 await 会导致语法错误,需通过 async IIFE(立即执行函数)包裹。
错误处理使用 try/catch 捕获异步操作中的错误:
async function loadData() { try { await fetchData(); } catch (error) { console.error('加载失败:', error); }}并行优化对无依赖的异步操作,使用 Promise.all 并行执行:
async function parallelLoad() { const [data1, data2] = await Promise.all([fetchA(), fetchB()]);}async/await 通过同步化的书写方式,显著提升了异步代码的可读性和可维护性。结合 sleep 函数,可以轻松实现加载动画、定时任务等效果。其核心优势包括:
通过合理使用 async/await,开发者能够更高效地管理 JavaScript 中的异步行为。