async/await 的劣势:能够很好地解决 then 链

对于繁多的 Promise 链其实并不能发现 async/await 的劣势,当须要解决由多个 Promise 组成的 then 链的时候,劣势就能体现进去了,
接下来间接上代码:

/** * 传入参数 n,示意这个函数执行的工夫(毫秒) * 执行的后果是 n + 200,这个值将用于下一步骤 */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);}

当初用 Promise 形式:

function doIt() {    console.time("doIt");    const time1 = 300;    step1(time1)        .then(time2 => step2(time2))        .then(time3 => step3(time3))        .then(result => {            console.log(`result is ${result}`);            console.timeEnd("doIt");        });}doIt();// c:vartest>node --harmony_async_await .// step1 with 300// step2 with 500// step3 with 700// result is 900// doIt: 1507.251ms

输入后果 resultstep3() 的参数 700 + 200 = 900doIt() 程序执行了三个步骤,一共用了 300 + 500 + 700 = 1500 毫秒,和 console.time()/console.timeEnd() 计算的后果统一。
用 async/await 的形式:

async function doIt() {    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");}doIt();

后果和之前的 Promise 是统一的,然而这个代码缩小了很多

当初改一下要求:

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);}

Promise实现:

function doIt() {    console.time("doIt");    const time1 = 300;    step1(time1)        .then(time2 => {            return step2(time1, time2)                .then(time3 => [time1, time2, time3]);        })        .then(times => {            const [time1, time2, time3] = times;            return step3(time1, time2, time3);        })        .then(result => {            console.log(`result is ${result}`);            console.timeEnd("doIt");        });}doIt();

async/await实现:

async function doIt() {    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");}doIt();// c:vartest>node --harmony_async_await .// step1 with 300// step2 with 800 = 300 + 500// step3 with 1800 = 300 + 500 + 1000// result is 2000// doIt: 2907.387ms

PS:因为在Promise中。咱们有时会被回绝拜访,这样Async/Await让try/catch能够同时解决同步和异步谬误。

具体对于async/await含意和用法能够参考:

http://www.ruanyifeng.com/blo...