知识点
- 前端的异步运行机制
- 创建一个Promise
- 等待一个Promise的运行
- 处理Promise的错误
- Promise的串联
- 同时等待多个Promise
- async/await 异步函数
实例: 计算 (1+2+3) * 10
# 定义返回 Promise类型数据
function add(a:number,b:number): Promise<number> {
return new Promise((resolve,reject) => {
if (b % 17 === 0){
reject(`bad number : ${b}`)
}
setTimeout(() => {
resolve(a +b)
},2000)
})
}
# 定义返回 Promise类型数据
function mul(a:number,b:number): Promise<number> {
return new Promise((resolve,reject) => {
setTimeout(() => {
resolve(a * b)
},2000)
})
}
add(1,2).
then(res => {
console.log("1 + 2 = "+res)
return add(res,17)
}).then(res => {
console.log("1 + 2 + 7 = "+res)
return mul(res,17)
}).then(res => {
console.log("(1 + 2 + 7) * 10 = "+res)
}).catch(err => {
console.log("err : "+err)
})
# new Promise((resolve,reject) resolve为正确情况,reject为错误情况
# 若需在下一个then中继续使用,则需要return
# catch可捕获异常
实例: 计算 (2+3) * (4+5),运用 Promise.all
Promise.all([add(2,3),add(4,5)]).then(res => {
const [a,b] = res
console.log('result',a,b)
return mul(a,b)
}).then(res => {
console.log('final result',res)
})
并行计算只返回最快执行 Promise.race
Promise.race([add(2,3),add(4,5)])
.then(res =>{
console.log(res)
})
async await
// 方式一
async function run (){
const [a,b] = await Promise.all([add(2,3),add(4,5)])
return mul(a,b)
}
run().then(res => console.log(res))
// 方式二 直接定义
const a = async ()=> {
const [a,b] = await Promise.all([add(2,3),add(4,5)])
return mul(a,b)
}
a().then(res => console.log(res))
async、await其实就是Promise语法糖
await不能用在全局中,需要放在某方法内,并且,此方法需要用async修饰,同时,此方法返回值是Promise类型