Promise
和 async/await
是 JavaScript 中用于处理异步操作的两种不同的语法结构,它们有以下主要区别:
Promise:
Promise
是异步编程的一种解决方案,早于async/await
出现。在Promise
出现之前,异步操作主要依靠回调函数(callback)来实现。Promise
对象有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。then
方法用来处理Promise
成功返回的结果,而catch
方法用来处理Promise
出错或被拒绝的情况。Promise
可以链式调用,这一点可以让我们通过.then()
连接多个异步操作,但在某些情况下可能会导致 “回调地狱”(Callback Hell)的问题。
doSomething()
.then(result => doSomethingElse(result))
.then(newResult => doThirdThing(newResult))
.catch(error => console.error(error));
async/await:
async/await
是基于Promises
的更高层次的抽象,于 ES2017 (ECMAScript 8) 引入,使得异步操作的写法更加接近同步操作。- 使用
async
关键字声明一个函数是异步的,await
关键字暂停异步函数的执行,等待Promise
的响应。 await
会等待其后的Promise
解决,并返回解决的值。如果Promise
被拒绝,则会抛出异常,可以用try...catch
来捕捉。async/await
使得代码更加直观,并且可以减少链式Promise
调用可能产生的复杂性。
async function asyncFunction() {
try {
const result = await doSomething();
const newResult = await doSomethingElse(result);
const finalResult = await doThirdThing(newResult);
console.log(finalResult);
} catch (error) {
console.error(error);
}
}
总的来说,async/await
在写法上更加简洁,让异步流程更易理解和维护。而 Promise
仍然是 async/await
背后的核心概念,并且在某些案例中,只使用 Promise
也是适宜的。