Promise,我们了解到promise是ES6为解决异步回调而生,避免出现这种回调地狱,那么为何又需要Async/Await呢?async-await
是promise
和generator
的语法糖。只是为了让我们书写代码时更加流畅,当然也增强了代码的可读性。简单来说:async-await 是建立在 promise机制之上的,并不能取代其地位下面一起来看看:Async/Await替代Promise的6个理由
什么是Async/Await?
- async/await是写异步代码的新方式,以前的方法有回调函数和Promise。
- async/await是基于Promise实现的,它不能用于普通的回调函数。
- async/await与Promise一样,是非阻塞的。
- async/await使得异步代码看起来像同步代码,这正是它的魔力所在
async
async用来表示函数是异步的,定义的函数会返回一个promise对象,可以使用then方法添加回调函数。
async function demo01() { return 123; } demo01().then(val => { console.log(val);// 123 });
若 async 定义的函数有返回值,return 123;相当于Promise.resolve(123),没有声明式的 return则相当于执行了Promise.resolve();
await
await 可以理解为是 async wait 的简写。await 必须出现在 async 函数内部,不能单独使用。
function notAsyncFunc() { await Math.random(); } notAsyncFunc();//Uncaught SyntaxError: Unexpected identifier
await 后面可以跟任何的JS 表达式。虽然说 await 可以等很多类型的东西,但是它最主要的意图是用来等待 Promise 对象的状态被 resolved。如果await的是 promise对象会造成异步函数停止
执行并且等待
promise 的解决,如果等的是正常的表达式则立即执行。
function sleep(second) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(' enough sleep~'); }, second); }) } function normalFunc() { console.log('normalFunc'); } async function awaitDemo() { await normalFunc(); console.log('something, ~~'); let result = await sleep(2000); console.log(result);// 两秒之后会被打印出来 } awaitDemo(); // normalFunc // VM4036:13 something, ~~ // VM4036:15 enough sleep~
接收回调用法区别:
1 function request() { 2 return new Promise((resolve, reject) => { 3 var xhr = new XMLHttpRequest() 4 xhr.open ("POST", url, true) 5 xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded") 6 xhr.onreadystatechange = function(){resolve({a:1})} 7 xhr.send({}) 8 }) 9 }
Promise用法:
1 request().then(function(respond){ 2 console.log(respond); 3 })
Async/Await用法:
console.log(await request());
区别: 函数前面多了一个aync关键字。await关键字只能用在aync定义的函数内。async函数会隐式地返回一个promise,该promise的reosolve值就是函数return的值.使用Async/Await明显节约了不少代码。我们不需要写.then,不需要写匿名函数处理Promise的resolve值,也不需要定义多余的data变量,还避免了嵌套代码。这些小的优点会迅速累计起来,这在之后的代码示例中会更加明显