参考博客:理解 JavaScript 的 async/await
async/await 是Generator的语法糖,异步编程更加直观且易于理解。
async/await 的优势在于处理 then 链。
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
function takeLongTime(n) { return new Promise(resolve => { setTimeout(() => resolve(n + 200), n); }); }
function step1(n) { console.log(`step1 with ${n}`); return takeLongTime(n); }
function step2(n) { console.log(`step2 with ${n}`); return takeLongTime(n); }
function step3(n) { console.log(`step3 with ${n}`); return takeLongTime(n); }
async function doIt() { try{ console.time("doIt"); const time1 = 300; const time2 = await step1(time1); const time3 = await step2(time2); const result = await step3(time3); console.log(`result is ${result}`); console.timeEnd("doIt"); } catch (err) { console.error(err); } }
doIt();
|
修改业务,每一个步骤都需要之前每个步骤的结果:
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| function takeLongTime(n) { return new Promise(resolve => { setTimeout(() => resolve(n + 200), n); }); }
function step1(n) { console.log(`step1 with ${n}`); return takeLongTime(n); }
function step2(m, n) { console.log(`step2 with ${m} and ${n}`); return takeLongTime(m + n); }
function step3(k, m, n) { console.log(`step3 with ${k}, ${m} and ${n}`); return takeLongTime(k + m + n); }
async function doIt() { try{ console.time("doIt"); const time1 = 300; const time2 = await step1(time1); const time3 = await step2(time1, time2); const result = await step3(time1, time2, time3); console.log(`result is ${result}`); console.timeEnd("doIt"); } catch (err) { console.error(err); } }
doIt();
|