async/await与promise的区别
async:
async 是“异步”的简写, async 用于申明一个异步的 function。
async是一个加在函数前的修饰符,被async定义的函数会默认返回一个Promise对象resolve的值。因此对
async函数可以直接then,返回值就是then方法传入的函数。async声明的函数的返回本质是一个Promise。
await:
await 可以认为是 async wait 的简写,await 用于等待一个异步方法执行完成。
await 也是一个修饰符,只能放在async定义的函数内。可以理解为等待。
await 修饰的如果是Promise对象:可以获取Promise中返回的内容(resolve或reject的参数),
且取到值后语句才会往下执行;如果不是Promise对象:把这个非promise的东西当做await表达式的结果。
下面用代码进行展示:
function autoGentorat(genF) { // 返回一个promise,可以链式调用 return new Promise(function(resolve, reject) { // 实例化实参(实参是传递过来的Generator),获得next方法 let gen = genF(); function step(result) { // Generator执行到最后,done是true, if (result.done) { resolve(result.value); } else { // 没执行完,使用promise的方式让其进行下一步 // 因为 result你不知道是否是一个异步的操作,所以需要promise Promise.resolve(result.value).then(function(res) { // 上一步等待执行结果完毕,进行下一步 step(gen.next(res)); }); } } // 开始执行generrator第一步 step(gen.next(undefined)); }); } function getUserInfo(){ return new Promise(function(resolve,relect){ setTimeout(function(){ resolve({name:'小刘鸭'}) },2000) }) } autoGentorat(function*() { yield 1; let data = yield getUserInfo(); })
最后总结,async/await与promise的区别:
1.Promise的出现解决了传统callback函数导致的“地狱回调”问题,但它的语法导致了它向纵向发展行成了一个回调链,遇到复杂的业务场景,这样的语法显然也是不美观的。而async await代码看起来会简洁些,使得异步代码看起来像同步代码,await的本质是可以提供等同于”同步效果“的等待异步返回能力的语法糖,只有这一句代码执行完,才会执行下一句。
2.async await与Promise一样,是非阻塞的。
3.async await是基于Promise实现的,可以说是改良版的Promise,它不能用于普通的回调函数。