在 TypeScript 中,async
是一个关键字,用于定义异步函数。异步函数是一种返回Promise
对象的函数,它允许在不阻塞主线程的情况下执行异步操作。以下是关于async
的详细介绍:
基本用法
使用async
关键字来定义一个异步函数,示例如下:
async function getData() {
// 这里可以执行异步操作,比如从网络获取数据
const response = await fetch('https://example.com/api/data');
const data = await response.json();
return data;
}
getData().then(result => console.log(result));
在上述代码中,getData
函数被定义为异步函数。在函数内部,使用await
等待fetch
操作完成并解析响应数据。
特点
- 返回值为 Promise:异步函数始终返回一个
Promise
对象。即使函数内部没有显式地返回一个Promise
,JavaScript 也会自动将返回值包装在一个Promise
中。 - 可暂停执行:
await
只能在async
函数内部使用,它会暂停异步函数的执行,直到Promise
被解决(resolved)或被拒绝(rejected)。这使得异步代码看起来更像是同步代码,提高了代码的可读性和可维护性。
与 Promise 的关系
async
函数是基于Promise
实现的一种更高级的异步编程模式。它简化了Promise
的使用,避免了过多的then
链式调用。例如,下面是一个使用Promise
和async
函数实现相同功能的对比:
使用 Promise:
function getDataWithPromise() {
return fetch('https://example.com/api/data')
.then(response => response.json())
.then(result => result);
}
getDataWithPromise().then(result => console.log(result));
使用 async 函数:
async function getDataWithAsync() {
const response = await fetch('https://example.com/api/data');
const data = await response.json();
return data;
}
getDataWithAsync().then(result => console.log(result));
可以看到,async
函数让异步代码更加简洁明了。
错误处理
在async
函数中,可以使用try...catch
语句来捕获异步操作中发生的错误。例如:
async function getData() {
try {
const response = await fetch('https://example.com/api/data');
if (!response.ok) {
throw new Error('网络请求失败');
}
const data = await response.json();
return data;
} catch (error) {
console.error('获取数据时出错:', error);
}
}
getData();
在上述代码中,如果fetch
操作失败或响应状态码不是2xx
,就会抛出错误并在catch
块中进行处理。