
本文将介绍如何使用 async/await 关键字在 JavaScript 中创建一个异步加载动画。通过使用 Promise 和 setTimeout,我们可以模拟一个耗时的加载过程,并在加载完成后执行后续操作,避免阻塞主线程,从而提升用户体验。文章提供了一个简单的示例,展示了如何创建一个旋转的加载指示器,并在加载完成后显示“加载完成”的消息。
利用 async/await 简化异步操作
在 JavaScript 中,处理异步操作的传统方式是使用回调函数。但是,当异步操作嵌套较多时,回调函数会导致代码难以阅读和维护,也就是常说的“回调地狱”。async/await 关键字提供了一种更简洁、更易于理解的方式来处理异步操作,使代码看起来更像同步代码。
async 关键字用于声明一个异步函数。异步函数内部可以使用 await 关键字来暂停函数的执行,直到一个 Promise 对象被解决(resolved)或拒绝(rejected)。
实现异步加载动画
以下是一个使用 async/await 实现异步加载动画的示例:
立即学习“Java免费学习笔记(深入)”;
// 定义一个 sleep 函数,用于暂停指定的时间
const sleep = ms => new Promise(r => { setTimeout(r, ms);});
// 定义一个异步函数 OSLoad,用于模拟操作系统加载过程
async function OSLoad(OS = "", loadingTimeSeconds = 10) {
var P = ["\\", "|", "/", "-"]; // 定义旋转指示器的字符
var x = 0;
// 循环模拟加载过程
for (let lp = 0; lp < loadingTimeSeconds * 4; lp ++) {
process.stdout.write(
"\r" + P[x++] + " Loading " + OS // 写入旋转指示器和加载信息
);
x &= 3; // 循环使用旋转指示器字符
await sleep(250); // 暂停 250 毫秒
}
process.stdout.write("\r" + OS + " is loaded.."); // 加载完成后显示消息
}
// 调用 OSLoad 函数,开始加载动画
OSLoad('Fake OS 4.01');代码解释:
sleep 函数: 这是一个简单的 Promise 函数,它接受一个毫秒数作为参数,并返回一个 Promise 对象。当 setTimeout 函数执行完毕后,Promise 对象会被解决。这个函数用于模拟一个耗时的操作。
OSLoad 函数: 这是一个异步函数,使用 async 关键字声明。它接受两个参数:OS(操作系统名称)和 loadingTimeSeconds(加载时间,单位为秒)。
旋转指示器: P 数组定义了旋转指示器的字符。x 变量用于循环使用这些字符。
加载循环: for 循环模拟加载过程。在每次循环中,process.stdout.write 函数用于将旋转指示器和加载信息写入控制台。await sleep(250) 语句暂停函数的执行 250 毫秒,模拟加载过程的耗时。
加载完成: 循环结束后,process.stdout.write 函数用于显示“加载完成”的消息。
注意事项:
- async 函数必须在 async 函数或模块的顶层作用域中使用。
- await 关键字只能在 async 函数内部使用。
- await 关键字会暂停函数的执行,直到 Promise 对象被解决或拒绝。
- 使用 async/await 可以使异步代码更易于阅读和维护,但并不会改变异步操作的本质。
总结
通过使用 async/await 关键字,我们可以更简洁、更易于理解地处理 JavaScript 中的异步操作。在创建加载动画等需要模拟耗时操作的场景中,async/await 可以帮助我们编写更清晰、更易于维护的代码。希望本文能够帮助你理解和使用 async/await 关键字,并在你的项目中应用它。










