【异步编程】1. 异步编程的实现方式

喜欢ヅ旅行 2023-10-13 17:21 77阅读 0赞

总体介绍

回调函数的方式,使用回调函数的方式有一个缺点是,多个回调函数嵌套的时候会造成回调函数地狱,上下两层的回调函数间的代码耦合度太高,不利于代码的可维护。

Promise的方式,使用 Promise 的方式可以将嵌套的回调函数作为链式调用。但是使用这种方法,有时会造成多个 then 的链式调用,可能会造成代码的语义不够明确。

generator 的方式,它可以在函数的执行过程中,将函数的执行权转移出去,在函数外部还可以将执行权转移回来。当遇到异步函数执行的时候,将函数执行权转移出去,当异步函数执行完毕时再将执行权给转移回来。因此在 generator 内部对于异步操作的方式,可以以同步的顺序来书写。使用这种方式需要考虑的问题是何时将函数的控制权转移回来,因此需要有一个自动执行 generator 的机制,比如说 co 模块等方式来实现 generator 的自动执行。

async 函数 的方式,async 函数是 generator 和 promise 实现的一个自动执行的语法糖,它内部自带执行器,当函数内部执行到一个 await 语句的时候,如果语句返回一个 promise 对象,那么函数将会等待 promise 对象的状态变为 resolve 后再继续向下执行。因此可以将异步逻辑,转化为同步的顺序来书写,并且这个函数可以自动执行。

场景介绍

假设我们有这么一个场景:我们从前端发送一个网络请求,去服务器获取用户信息,服务器返回给前端数据后,前端打印用户的名称。

回调函数

  1. function getUserInfo(callback) {
  2. //前面有若干代码
  3. setTimeout(function () {
  4. const user = {
  5. id: 1, name: "codereasy" };
  6. callback(user);
  7. }, 1000);
  8. //后面有若干代码
  9. console.log("我继续执行后续代码了,网络请求不会阻塞后续代码执行");
  10. }
  11. getUserInfo(function (user) {
  12. console.log(user.name);
  13. });

Promise

  1. function getUserInfo() {
  2. return new Promise(function (resolve, reject) {
  3. setTimeout(function () {
  4. const user = {
  5. id: 1, name: "codereasy" };
  6. resolve(user);
  7. }, 1000);
  8. });
  9. }
  10. getUserInfo()
  11. .then(function (user) {
  12. console.log(user.name);
  13. })
  14. .catch(function (error) {
  15. console.log(error);
  16. });
  17. //后续代码
  18. console.log("正在执行后续代码,网络请求没有阻塞后续代码");

生成器和迭代器

什么是生成器和迭代器:https://blog.csdn.net/wtswts1232/article/details/131723831

  1. function* getUserInfo() {
  2. yield new Promise(function (resolve, reject) {
  3. setTimeout(function () {
  4. resolve({
  5. id: 1, name: "codereasy" });
  6. }, 1000);
  7. });
  8. }
  9. const iterator = getUserInfo();
  10. iterator.next().value.then(function (param) {
  11. console.log("当前获取的结果是", param);
  12. });
  13. //后续代码
  14. console.log("网络请求没有阻塞后续代码");

async和await

  1. function getUserInfo() {
  2. return new Promise(function (resolve, reject) {
  3. setTimeout(function () {
  4. resolve({
  5. id: 1, name: "John Doe" });
  6. }, 1000);
  7. });
  8. }
  9. async function getUser() {
  10. try {
  11. const user = await getUserInfo();
  12. console.log(user.name);
  13. } catch (error) {
  14. console.log(error);
  15. }
  16. }
  17. getUser();

发表评论

表情:
评论列表 (有 0 条评论,77人围观)

还没有评论,来说两句吧...

相关阅读

    相关 异步编程

    及面试题:并发与并行的区别? 异步和这小节的知识点其实并不是一个概念,但是这两个名词确实是很多人都常会混淆的知识点。其实混淆的原因可能只是两个名词在中文上的相似,在英文...

    相关 异步编程

      如果需要 I/O 绑定(例如从网络请求数据或访问数据库),则需要利用异步编程。     C\ 拥有语言级别的异步编程模型,它使你能轻松编写异步代码,而无需应付回叫...

    相关 异步编程1

    一.什么是异步   启动程序时,系统会在内存中创建一个新的进程。进程是构成运行程序的资源的集合。这些资源包括虚地址空间、文件句柄和许多其他程序运行所需的东西。  在进程

    相关 js实现异步编程方式

    首先要说的是为什么要异步编程,它有什么优缺点? JavaScript是一种单线程执行的脚本语言(这可能是由于历史原因或为了简单而采取的设计)。它的单线程表现在任何一个函数都要