async-await 语法糖
可以使用 async-await 来管理 Promise,下例重写上一节使用 Promise + then 的形式计算 ( 2 + 3 ) × ( 4 + 5 ) (2+3) \times (4+5) (2+3)×(4+5):
typescript
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
)
}
)
}
function mul(a: number, b: number): Promise<number>{
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(a * b)
}, 3000)
// resolve(a * b)
})
}
// (2+3)*(4+5)
async function calc() {
const a = await add(2, 3) // 等到加法 add 之后, 将结果赋予 a
// await 必须在 async function 当中使用
console.log('2 + 3', a)
const b = await add(4, 5)
console.log('4 + 5', b)
const c = await mul(a, b)
console.log('a * b', c)
}
calc()
// output
[LOG]: "2 + 3", 5
[LOG]: "4 + 5", 9
[LOG]: "a * b", 45
await 所做的工作是异步等待,它相当于语法糖,等价于 add(2, 3).then(... ... ...)
。
如果将 c 作为返回值返回,那么 calc 的类型是Promise<number>
。
上述片段存在的一个问题是,使用两个 await 仍然是串行的计算,我们希望并行地执行两个加法,方法仍然是 await 一个 Promise.all:
typescript
async function calc() {
try {
const [a, b] = await Promise.all([add(2, 3), add(4, 5)])
console.log('2 + 3', a)
console.log('4 + 5', b)
return await mul(a, b)
} catch (err) {
console.log("caught err", err)
return undefined
}
}