理解async和await

async和await是用于对于异步操作的一种处理方式;

async会对指定的函数的返回结果进行Promise包装;

await会“等待”Promise的resolved结果,如果结果是reject,没有处理的话就会报错; 但是这种”等待“是必须要放在async修饰的函数中;

function takeLongTime() {
    return new Promise(resolve => {
        setTimeout(() => resolve("long_time_value"), 1000);
    });
}

async function test() {
    const v = await takeLongTime();
    console.log(v);
}

test();

await会自动的执行它的resolve,但是当Promise中返回的是reject的时候,就必须catch这个异常

async function sleep(n) {
    return new Promise(function(resolve, reject) {
      if (n) {
        resolve();
      } else {
        reject();
      }
    });
  }

  async function ts() {
    return await sleep(false).catch(function (error) {
      console.log(error);
    });
  }

  console.log(ts());

我们在使用async/await的时候会给我们带来极大的可阅读性:

这是一些异步方法:

async function ts() {
    return await sleep(false).catch(function (error) {
      console.log(error);
    });
  }

  console.log(ts());


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

使用await:

async function doIt() {
    const time1 = 300;
    const time2 = await step1(time1);
    const time3 = await step2(time1, time2);
    step3(time1, time2, time3).then(resolve => {
      console.log(resolve);
    });
  }
  doIt();

使用传统的promise.then链式编程:

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

借鉴于:边城    https://segmentfault.com/a/1190000007535316

posted @ 2021-04-01 14:40  coderLsq  阅读(570)  评论(0)    收藏  举报