async函数
async 函数可以把普通函数的返回值封装成一个 promise
async function foo() {
return 1
}
// 等同于
function foo(){
return Promise.resolve(1) // 注意这是是resolve
}
当函数不存在返回值时,则也会返回一个promise其中 [[PromiseResult]]: undefined
await
提到 async 就需要说到 await,如果函数体内有一个await表达式,async函数就一定会异步执行。
async function foo() {
await return 1
}
// 等同于
function foo(){
return Promise.resolve(1).then(()=> undefined)
}
await特性
-
必须在
async函数中使用,不可单独使用,否则会报SyntaxError错误。 -
async函数中,存在 0 个或者多个await,当执行到await时,函数将会暂停执行,直到await等待的promise的异步操作被兑现或被拒绝,才会恢复当前进程。 -
等待值为
promise对象,当等待值不是promise对象时,会将等待值作为正常处理的promise,然后等待其结果 -
当
promise结果为异常时,抛出异常值。
使用async改造 promise函数
function getProcessedData(url) {
return downloadData(url) // 返回一个 promise 对象
.catch(e => {k
return downloadFallbackData(url) // 返回一个 promise 对象
})
.then(v => {
return processDataInWorker(v); // 返回一个 promise 对象
});
}
async function getProcessedData(url) {
let v;
try {
v = await downloadData(url);
} catch (e) {
v = await downloadFallbackData(url);
}
return processDataInWorker(v);
}
总结
promise的出现是为了解决地狱回调,那么async和await的出现就是为了解决promise.then链过长的问题