1. 语法:
async function 异步函数(){
//代码
let promise = 其他异步函数()
// 代码
let result = await promise
/*此时result就不是Promise对象了,已经是返回的数据了*/
//处理result
return result;
}
/* 等同于以下代码: */
function 异步函数(){
return new Promise(resolve=>{//对应async语句
其他异步函数().then(result=>{//对应await语句
resolve(result)//对应return语句
})
})
}
1. 说明:
- await只能在异步函数中使用
async 异步函数
相当于new Promise(异步函数)
- 所以
异步函数().then().catch()
也是可用的
- 而对于async函数中的
return 值
语句, 就相当该语句:resolve(值)
- 默认异步函数执行完就会改变状态为成功
- 而不能像Promise对象中调用resolve那么灵活
- 当await的promise转变为rejected状态时,程序会抛出异常
- 相当于throw error
2. 注意:
1. 迭代await
- 如果在forEach()和map()的回调函数中去循环执行其他异步函数(即使回调函数使用了async关键字)
- 则await关键字会失效
- 需要使用不带回调函数的for循环, 如普通的for或者for of
1.1. 实例:
function sleep(ms: number) {
return new Promise((resolve, reject) => {
setTimeout(() => { resolve('') }, ms)
})
}
(async function main() {
// 传统for语句可以迭代await
for (let i = 1; i < 3; i++) {
await sleep(1000)
console.log(i)
}
//for of 也可以迭代await
for (const i of [1, 2]) {
await sleep(1000)
console.log(i)
}
//forEach 不能迭代await
[1, 2].forEach(async (i) => {
await sleep(1000)
console.log(i)
})
})()