在JavaScript中,函数前加async
和不加async
主要有以下区别:
-
返回值类型:
- 加
async
:使用async
关键字声明的函数总是返回一个Promise
对象。这意味着,无论函数中返回的是什么值,它都会被自动包装在一个Promise
中。 - 不加
async
:普通函数返回的是其执行结果,它不会自动包装在Promise
中。如果需要返回一个Promise
,你需要手动创建并返回它。
- 加
-
内部使用
await
:- 加
async
:async
函数内部可以使用await
关键字来等待Promise
的解决(resolve)或拒绝(reject)。await
会暂停async
函数的执行,直到等待的Promise
完成。 - 不加
async
:普通函数中不能使用await
关键字,因为await
只能在async
函数内部使用。
- 加
-
错误处理:
- 加
async
:在async
函数中,如果抛出异常,这个异常会被Promise
捕获,并导致Promise
被拒绝(reject)。可以通过.catch()
方法来捕获和处理这些异常。 - 不加
async
:在普通函数中抛出的异常需要通过其他方式来捕获和处理,例如使用try...catch
语句。
- 加
-
代码风格:
- 加
async
:async
函数使得异步代码的编写更加接近同步代码的风格,这可以提高代码的可读性和可维护性。 - 不加
async
:普通函数需要使用回调函数、Promise链式调用或async/await
(如果返回的是Promise
)来处理异步操作,这可能会使代码更加复杂。
- 加
下面是一个简单的例子来说明这些区别:
// 普通函数
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => resolve('Data fetched'), 1000);
});
}
// 使用普通函数和Promise链式调用
fetchData()
.then(data => console.log(data))
.catch(error => console.error(error));
// async函数
async function fetchDataAsync() {
return 'Data fetched';
}
// 使用async函数和await
async function fetchDataAndProcessAsync() {
try {
const data = await fetchDataAsync(); // 等待Promise解决
console.log(data);
} catch (error) {
console.error(error);
}
}
在这个例子中,fetchData
是一个普通函数,它返回一个Promise
。而fetchDataAsync
是一个async
函数,它也返回一个Promise
,但可以内部使用await
来等待其他Promise
的解决。