在 Node.js 中,异步编程几乎是不可避免的。然而传统的回调函数方式却往往复杂且难以维护。ES7 中引入了 async/await 关键字,使得异步编程变得更加直观和容易理解。本文将详细介绍 async/await 的原理和使用方法,并提供一些示例代码。
async/await 的原理
在 ES7 中,async/await 本质上是基于 Promise 的语法糖。在实际运行中,async 函数返回一个 Promise 对象,await 可以控制代码的执行顺序,保证异步操作的顺序执行,避免了回调函数嵌套的问题。
这里有一个简单的示例代码,演示了 async/await 实现异步操作的原理。
-- -------------------- ---- ------- -------- ---------------------- - ------ --- --------------- -- - ------------- -- - -------------------- -- ------ --- - ----- -------- ----------- - ----------------------- ----- ------ - ----- ----------------------- -------------------- -- -------- ------- ---------- - ------------
上述代码中,resolveAfter2Seconds 函数返回一个 Promise 对象,等待 2000 毫秒后才会 resolve。在 asyncCall 函数中,我们使用 await 等待 resolveAfter2Seconds 返回的结果。当 resolveAfter2Seconds 返回结果后,asyncCall 函数继续执行,并输出结果。
async/await 的使用方法
- async 函数
使用 async 关键字定义一个异步函数,在异步函数中可以使用 await 对异步操作进行等待。
async function foo() { // ... }
async 函数在被调用时会立即返回一个 Promise 对象,可以用于链式调用。
foo().then(result => console.log(result));
- await 表达式
使用 await 表达式等待一个返回结果的 Promise 对象,代码会暂停执行,直到原 Promise 对象 resolve 或 reject 后再继续执行。
result = await somePromise();
- try-catch 结构
try-catch 结构可以捕获异步函数中的异常。
try { const result = await somePromise(); // ... } catch (error) { // handle error }
async/await 示例代码
1. 使用 async/await 调用接口
-- -------------------- ---- ------- ----- -------- ----------- - ----- -------- - ----- --------------------------------------------- -- ------------- - ----- ---- - ----- ---------------- ------ ----- - ---- - ----- --- -------------- -------- --- --- ------ - -
上述代码中,getUser 函数使用 fetch 方法调用一个接口。使用 await 等待 fetch 方法返回的 Promise 对象,如果响应状态是 200 OK,使用 await 方法等待解析出来的 JSON 对象。否则,抛出异常。
2. 使用 Promise.all 实现多个异步操作并行执行
async function getUserAndOrders(userId) { const [user, orders] = await Promise.all([ fetch(`https://api.example.com/users/${userId}`).then(response => response.json()), fetch(`https://api.example.com/orders?user=${userId}`).then(response => response.json()), ]); return { user, orders }; }
上述代码中,getUserAndOrders 函数同时获取用户信息和订单信息。使用 Promise.all 接收一个 Promise 对象数组,等待所有 Promise 对象都 resolve 后再继续执行。返回打包好的用户信息和订单信息。
总结
async/await 关键字使得异步编程变得更加简单和直观,避免了传统回调函数嵌套的问题。这种新的语法糖在 Node.js 中得到了广泛的应用,在实现并行异步操作、异常处理等方面都非常有用。学习和掌握 async/await,将有助于提高编写高质量 Node.js 代码的能力。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/649ac88b48841e98947baa98