Node.js 知识体系(八)-异步编程之 async_await

这是我参与更文挑战的第二十八天,活动详情查看:更文挑战

  • async fnctionPromise 的语法糖封装

  • 异步编程的终极解决方案-以同步的方式写异步

    • await 关键字可以”暂停 ⏸” async function 的执行
    • await 关键字可以同步获取 Promise 的执行结果
    • try catch 可以捕获 await 的错误
  • 一个穿越事件循环的 function- 可以在多个事件循环之间的代码进行联系 ????

async function 是 Promise 的语法糖封装

const a = async function () {
  return 1;
};

const b = function () {
  return new Promise((resolve, reject) => {
    resolve(1);
  });
};

console.log(a());
console.log(b());
复制代码

aaaaaa.png

const aa = async function () {
  throw new Error("1");
};

const bb = function () {
  return new Promise((resolve, reject) => {
    resolve(new Error("1"));
  });
};

console.log(aa());
console.log(bb());
复制代码

cccc.jpg

async/await 用同步的方式写异步代码

(function () {
  const result = (async function () {
    const content = await new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve("content-res");
      }, 500);
    });

    console.log("content", content);
    return 4;
  })();

  setTimeout(() => {
    console.log("result", result);
  }, 800);
})();
复制代码

20210312151720.jpg

await 会等待 后面的 Promise 的状态变更,当获得结果之后,才会执行下一行的代码

try catch 可以捕获到 async/await 异步任务的错误

(function () {
  const result = (async function () {
    let content = null;
    try {
      content = await new Promise((resolve, reject) => {
        setTimeout(() => {
          reject(new Error("fail"));
        }, 500);
      });
    } catch (error) {
      console.log("error", error);
    }

    console.log("content", content);
    return 4;
  })();

  setTimeout(() => {
    console.log("result", result);
  }, 800);
})();
复制代码

111111.jpg

改造多轮面试代码-串行

// round 面试第几轮
function interview(round) {
  return new Promise(function (resolve, reject) {
    setTimeout(() => {
      if (Math.random() > 0.2) {
        // resolve, reject 只能接受一个参数
        resolve("success");
      } else {
        const error = new Error("fail");
        reject({ round, error });
      }
    }, 500);
  });
}

(async function () {
  try {
    await interview(1);
    await interview(2);
    await interview(3);
  } catch (error) {
    console.log(`第${error.round}轮面试失败了`);
    return;
  }
  console.log("每轮面试都成功!?");
})();
复制代码

实现并行

//
function interview(name) {
  return new Promise(function (resolve, reject) {
    setTimeout(() => {
      if (Math.random() > 0.2) {
        // resolve, reject 只能接受一个参数
        resolve("success");
      } else {
        const error = new Error("fail");
        reject({ name, error });
      }
    }, 500);
  });
}

(async function () {
  try {
    await Promise.all([
      interview("tenxun"),
      interview("ali"),
      interview("huawei"),
    ]);
  } catch (error) {
    console.log(`面试${error.name}失败了`);
    return;
  }
  console.log("每个公司面试都成功!?");
})();
复制代码

最后

文章浅陋,欢迎各位看官评论区留下的你的见解!

觉得有收获的同学欢迎点赞,关注一波!

good

往期文章

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享