什么是 Promise?
Promise 是一种异步编程的解决方案,用来解决回调地狱的问题。在 Promise 的编程模型中,异步操作返回一个 Promise 对象,这个对象代表异步操作的结果。当异步操作结束时,Promise 对象的状态会发生改变,可以是 Fulfilled(操作成功)或 Rejected(操作失败)。
如何使用 Promise?
在 ECMAScript 6(ES6)中,Promise 是一个内置的全局对象。要创建一个 Promise 对象,可以使用 Promise 构造函数,它接收一个函数作为参数,这个函数就是所谓的执行器函数(executor function):
const promise = new Promise((resolve, reject) => { // 执行异步操作 // 当操作结束时调用 resolve 或 reject 函数 });
执行器函数接收两个函数作为参数:resolve 和 reject。当异步操作成功时,调用 resolve 函数,并将操作结果作为参数传递给它。当异步操作失败时,调用 reject 函数,并将错误信息作为参数传递给它。
-- -------------------- ---- ------- ----- ------- - --- ----------------- ------- -- - ------------- -- - ------------------- -- ------ --- ------------- ------ -- -------------------- -- -- --------- ----- -- -------------------- --
在上面的例子中,异步操作使用 setTimeout 模拟,将在 1 秒钟后成功,并调用 resolve 函数返回结果。promise.then 方法用于注册当异步操作成功后要执行的回调函数并处理结果,第一个参数接收成功的结果,第二个参数接收失败的错误信息。
Async/Await 是什么?
Async/Await 是 ES2017 中引入的新语法(实际上是 Generator 和 Promise 许多特性的语法糖),它使得异步编程更加具有表现力和易读性。使用 Async/Await 可以让异步代码看起来像同步代码的写法,也就是在函数前使用 async 关键字,并在异步操作前使用 await 关键字。
async function asyncFunc() { const result = await somePromise; console.log(result); }
在上面的例子中,async 关键字表示这个函数是异步的,await 关键字表示后面的表达式是一个 Promise 对象,等待 Promise 对象状态发生变化后再继续执行。
Async/Await Promise 结合使用
Asnyc/Await 和 Promise 是可以结合使用的,Async 函数返回的是一个 Promise 对象,而 Await 可以等待 Promise 对象状态的变化:
-- -------------------- ---- ------- ----- -------- ----------- - --- - ----- -------- - ----- ---------------------------------------------------------- ----- ---- - -------------- ------------------ - ----- ------- - --------------------- - - ------------
在上面的例子中,fetchData 函数返回一个 Promise 对象,并使用 await 等待 axios.get 返回一个 Promise 对象的状态。如果 Promise 状态变为 Fulfilled,await 返回 Promise 对象的结果值;如果 Promise 状态变为 Rejected,await 抛出 Promise 对象的错误对象。
Async/Await Promise 优缺点
优点
- 更易读:使用 Async/Await 可以让异步代码看起来像同步代码的写法,也就是可以消除回调地狱;
- 更易调试:采用 Async/Await 的方法可以让错误更加有意义,也更容易调试;
- 更容易控制异步顺序:使用 Async/Await 可以让开发人员更容易控制异步操作的顺序。
缺点
- 只能在异步函数内部使用:Async/Await 只能在异步函数内部使用,如果在普通函数内部使用,将会得到语法错误;
- 只是 Promise 的语法糖:Async/Await 只是 Generator 和 Promise 许多特性的语法糖,并不是一种新的异步编程解决方案;
- 老浏览器不支持:Async/Await 在老版本的浏览器中可能会出现兼容性问题。
结论
Promise 和 Async/Await 是异步编程的两种主流解决方案,都有优缺点,在实际开发中应根据具体情况选择合适的方案。如果条件允许,可以使用 Async/Await,因为它可以让异步代码看起来更加简洁和易读。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66f2219aa44b36ee5763db72