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有更好的语义。