优雅的使用async await 编写代码
Promise链式调用
首先有多个异步方法
- 返回一个Promise对象
- 有50%的几率返回正确 50%返回错误
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| function p1() : Promise<string> { return new Promise<string>((resolve, reject) => { setTimeout(()=>{ if(Math.random() > 0.5){ resolve('p1 success') } else { reject('p1 error') } }, 500); }) }
function p2() : Promise<string> { return new Promise<string>((resolve, reject) => { setTimeout(()=>{ if(Math.random() > 0.5){ resolve('p2 success') } else { reject('p2 error') } }, 500); }) }
|
调用这个方法
1 2 3 4 5 6 7 8 9 10 11 12 13
| function main() { p1() .then(res => { console.log(res) return p2() }) .then(res => { console.log(res) }) .catch(err => { console.log(err) }) }
|
调用main方法
async & await
首先编写一个异步方法
- 返回一个Promise对象
- 有50%的几率返回正确 50%返回错误
1 2 3 4 5 6 7 8 9 10 11 12 13
| function asyncResult() : Promise<string> { return new Promise<string>((resolve, reject) => { setTimeout(()=>{ if(Math.random() > 0.5){ resolve('success') } else { reject('error') } }, 1000); }) }
|
调用这个异步方法
- 使用await 需要加async标识方法
- 因为异步方法我们定义了reject所以要抓取异常
1 2 3 4 5 6 7 8 9 10
| async function main() { let ans = await asyncResult().catch(err => { console.log(err) }) if (ans) { console.log('成功!', ans) } else { console.log('失败!') } }
|
调用main方法
async/await的错误使用
- 定义一个getZero的方法返回一个Promise
- getAsyncZero返回获取的值
- 使用了async/await,逻辑上会有误区先输出z再输出final
- 其实是先输出final再输出z
- 只在async的方法里面 await是按照顺序回调的, 相对其他的函数,这个调用不会堵塞主逻辑
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| function getZero() { return new Promise((resolve, reject) => { resolve(0) }); }
async function getAsyncZero() { let z = await getZero(); console.log('z', z) return z }
function main() { let final = getAsyncZero(); console.log('final', final); }
main();
|
输出
1 2
| final Promise { <pending> } z 0
|
修复async/await的错误
- 如果硬要使用async的方法返回值
- 需要给当前调用的方法加上async/await
- 【最好不要给async方法加返回值,会造成调用的混乱】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| function getZero() { return new Promise((resolve, reject) => { resolve(0) }); }
async function getAsyncZero() { let z = await getZero(); console.log('z', z) return z }
async function main() { let final = await getAsyncZero(); console.log('final', final); }
main();
|
输出