await和async代替promise
来到新公司,发现代码里好多地方用到里await搭配async的使用,尤其是调用接口的地方。 好奇这种同步获取接口数据的方法,以前都是用promise.then()的方式,当要按顺序调用接口时,得一层层的then嵌套。而现在只要并排的写await就可以了。
首先async定义的函数,返回的都是一个primise对象:
async function timeout() { return 'hello world'; }
console.log(timeout());
打印出来如下图
await
的意思就是等待。它后面可以跟一个表达式。如果是值(如字符串、数字、普通对象等等)的话,返回值就是本身的值。- 不过最常用的是后面跟一个
promise
对象。await
会等待这个promise
的状态由pending
转为fulfilled
或者rejected
。在此期间它会阻塞,延迟执行await语句后面的语句。
所以为了解决await的阻塞问题, 一般都要配套async加在函数声明时一起使用,这样做就能把阻塞限制在函数内部,不影响函数外的代码执行。
如下是配套的使用方式
async getData() { try { let dataList = await this.getList(); this.dataList = dataList console.log(dataList) } catch(err) { console.log(err); } }
async和await,把异步执行的代码写得像同步代码那样直观。async的函数中可以有一个或多个异步操作,一旦遇到await就会立即返回一个pending状态的Promise对象,暂时返回执行代码的控制权,使得函数外的代码得以继续执行,这是保证非阻塞的部分。