Promise 系列 | 番外篇 - async/await 的优势及与 Promise 的比较
2023-10-30 01:51:23
Promise 系列多加一篇,谈谈 async/await。这两个家伙是处理异步代码的语法糖,它们香在哪里呢?在处理异步代码时,和 Promise 又有什么差别呢?
首先,async/await 的语法更简洁、易读。大家还记得 Promise 的写法吗?先用 new Promise() 创建一个 Promise 实例,然后用 .then() 方法添加回调函数,再用 .catch() 方法添加错误处理函数。代码如下:
const promise = new Promise((resolve, reject) => {
// 异步操作
});
promise.then((result) => {
// 成功回调
}).catch((error) => {
// 错误处理
});
是不是有点啰嗦?async/await 则可以把这些代码简化成这样:
async function myAsyncFunction() {
try {
const result = await Promise.resolve('Hello, world!');
console.log(result);
} catch (error) {
console.error(error);
}
}
myAsyncFunction();
是不是清爽多了?async/await 的用法和同步代码非常相似,只是在前面加了一个 async ,然后用 await 关键字等待 Promise 的结果。
其次,async/await 可以更好地控制代码的执行顺序。Promise 是基于回调函数的,回调函数的执行顺序是不确定的。这在某些情况下可能会导致问题,比如在处理多个异步操作时,我们希望按照一定的顺序执行这些操作。async/await 则可以很好地解决这个问题,它可以让我们按照代码的顺序执行异步操作。
最后,async/await 可以更好地处理错误。Promise 的错误处理是通过 .catch() 方法来实现的,这个方法只能捕获当前 Promise 实例的错误。如果在回调函数中又抛出了一个错误,.catch() 方法是无法捕获到的。async/await 则可以捕获所有在 async 函数中抛出的错误,包括回调函数中抛出的错误。
综上所述,async/await 在处理异步代码时比 Promise 有很多优势,它语法更简洁、易读,可以更好地控制代码的执行顺序,也可以更好地处理错误。因此,在编写异步代码时,我们应该优先使用 async/await。
当然,Promise 也有它的用武之地。比如,当我们需要在多个地方使用同一个 Promise 的结果时,或者当我们需要在回调函数中返回一个 Promise 时,我们仍然可以使用 Promise。