async
async函数就是将 Generator 函数的星号(*)替换成async,将yield替换成await,仅此而已。
- async函数自带执行器,不必像generator函数执行完还需要next( )。
- async表示函数里有异步操作,await表示紧跟在后面的表达式需要等待结果。
- async函数的返回值是 Promise 对象。
关键点async函数完全可以看作多个异步操作,包装成的一个 Promise 对象,而await命令就是内部then命令的语法糖。
//async函数的返回值肯定是promise对象。即使不是也会使用Promise.resolve()进行转换。//因为需要返回promise对象,来捕获async内的错误。async function foo() {var a = await setTimeout(() => {console.log(1)}, 2000);return 2;}
await
await等待的是promise对象的resolve(value),接受到的值。如果不是promise对象,相当于await Promise.resolve( )。
function time() {return new Promise((resolve, reject) => {setTimeout(() => {resolve(1);}, 1000)})}function time1() {return new Promise((resolve, reject) => {setTimeout(() => {resolve(2);}, 4000)})}async function foo() {let value1 = await time(); //等待resolve()的返回值(阻塞1s)console.log(value1); //执行let value2 = await time1(); //等待resolve()的返回值(阻塞4s)console.log(value2); //执行}console.log(foo());
async VS promise
问题async异步编程语法同promise优势在哪里?
处理多层回调。promise是通过then( )的链式调用,实现多层回调。但是在语义上仍感觉差一点。async直接想写同步代码一样,实现多层的回调,比promise有更好的语义。
