async
和 await
是 JavaScript 中用于处理异步操作的特性,它们使异步代码更易于编写和理解。下面我将详细解释它们,并提供一些示例来说明它们的用法。
-
async
函数:async
关键字用于定义一个异步函数。异步函数是返回一个 Promise 对象的函数。在异步函数内部,你可以使用await
来等待异步操作的完成。下面是一个示例:async function fetchData() { // 模拟异步操作,例如发起 HTTP 请求 const response = await fetch('https://api.example.com/data'); const data = await response.json(); return data; } // 调用异步函数 fetchData() .then((data) => { console.log('数据获取成功:', data); }) .catch((error) => { console.error('数据获取失败:', error); });
在上面的示例中,
fetchData
是一个异步函数,内部使用await
关键字等待异步操作完成。fetch
函数返回一个 Promise,所以我们使用await
来等待 HTTP 请求的结果。最终,fetchData
函数返回一个 Promise,我们可以使用.then
和.catch
来处理异步操作的结果或错误。 -
await
表达式:await
关键字用于等待一个 Promise 对象的解决(resolved)。它只能在异步函数内部使用。当await
表达式执行时,它会阻塞函数的执行,直到 Promise 对象解决为止。下面是一个示例:async function example() { console.log('开始'); const result = await new Promise((resolve) => { setTimeout(() => resolve('等待结束'), 2000); }); console.log('结果:', result); console.log('结束'); } example();
在上面的示例中,
await
表达式等待一个 2 秒的定时器,然后打印结果。在等待的过程中,函数不会继续执行。 -
错误处理:
你可以使用
try...catch
语句来捕获异步操作中的错误。这使得异步代码中的错误处理变得非常方便:async function fetchData() { try { const response = await fetch('https://api.example.com/data'); if (!response.ok) { throw new Error('请求失败'); } const data = await response.json(); return data; } catch (error) { console.error('出现错误:', error); throw error; } }
在上面的示例中,我们使用
try...catch
来捕获可能出现的错误,例如 HTTP 请求失败或 JSON 解析错误。
总之,async
和 await
是 JavaScript 中用于处理异步操作的强大特性,它们让异步代码更易于编写和维护。通过将异步操作包装在异步函数内部,你可以在代码中使用同步的方式编写异步操作,使代码更加清晰和可读。同时,你可以使用 await
来等待异步操作的结果,使得错误处理也变得更加方便。