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

2023-10-27

总体介绍

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

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

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

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

场景介绍

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

回调函数

 function getUserInfo(callback) {
   //前面有若干代码
   setTimeout(function () {
     const user = { id: 1, name: "codereasy" };
     callback(user);
   }, 1000);
   //后面有若干代码
   console.log("我继续执行后续代码了,网络请求不会阻塞后续代码执行");
 }

 getUserInfo(function (user) {
   console.log(user.name);
 });

Promise

function getUserInfo() {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      const user = { id: 1, name: "codereasy" };
      resolve(user);
    }, 1000);
  });
}

getUserInfo()
  .then(function (user) {
    console.log(user.name);
  })
  .catch(function (error) {
    console.log(error);
  });

//后续代码
console.log("正在执行后续代码,网络请求没有阻塞后续代码");

生成器和迭代器

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

function* getUserInfo() {
  yield new Promise(function (resolve, reject) {
    setTimeout(function () {
      resolve({ id: 1, name: "codereasy" });
    }, 1000);
  });
}

const iterator = getUserInfo();

iterator.next().value.then(function (param) {
  console.log("当前获取的结果是", param);
});

//后续代码
console.log("网络请求没有阻塞后续代码");


async和await

function getUserInfo() {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      resolve({ id: 1, name: "John Doe" });
    }, 1000);
  });
}

async function getUser() {
  try {
    const user = await getUserInfo();
    console.log(user.name);
  } catch (error) {
    console.log(error);
  }
}

getUser();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【异步编程】1. 异步编程的实现方式 的相关文章

  • Angular表单实现双向数据绑定

    创建组件过程省略 实现双向数据绑定 要在app module中引入并声明 表单组件内容 import Component from angular core Component selector app form templateUrl f
  • mysql开启日志general_log

    general log会记录下发送给MySQL服务器的所有SQL记录 因为SQL的量大 默认是不开启的 一些特殊情况 如排除故障 可能需要临时开启一下 开启MySQL的general log MySQL有三个参数用于设置general lo

随机推荐

  • OBS直播画质怎么调?

    有用户在使用OBS软件直播时 发现直播的画质太差了 想要调高画质 但是却不知道如何调整 OBS参数设置教程 1 双击或者右击打开OBS软件 接着点击右下角箭头所指的设置选项 2 来到设置界面后 点击页面左侧的输出选项 3 在下图所示的输出页
  • Python学习总结1(知识+示例)

    学习环境 Ubuntu18 04系统 Geany编辑器 Python3 Pyhton3 安装 sudo add apt repository ppa fkrull deadsnakes sudo apt get update sudo ap
  • 故障注入测试(Fault Injection Test)评价类型说明

    这周新一篇技术文章来袭 上周我们对故障注入测试 Fault Injection Test 方法进行了初步的了解 本周要分享的技术文章是 故障注入测试 Fault Injection Test 评价类型说明 将针对故障注入测试进行更深层的说明
  • Linux 字符串截取方法

    八种截取方法 场景 var http www baidu com abc html 1 删除左边字符 保留右边字符 例 echo var 输出内容 www baidu com abc html 表示所有 获取变量var从左边遍历开始遇到的第
  • linux常用压缩、解压缩文件或文件夹命令tar、zip

    前言 工作中 压缩 解压缩文件或文件夹是比较基本的操作了 利用 tar或zip 命令可以把一大堆的文件和目录打包成一个文件 这对于备份文件或是将几个文件组合成为一个文件进行网络传输是非常有用的 tar压缩文件 tar 选项 源文件或目录 选
  • 微信支付接入

    目 录 第1章 微信支付接入 2 第2章 微信小程序申请微信支付 3 2 1 申请微信支付 3 2 2 微信审核 3 2 3 账户参数说明 4 第3章 微信公众号申请微信支付 5 3 1 支付申请 5 3 2 提交资料 6 3 3 填写商户
  • 多益网络校招前端面经(2020.09.24)

    多益网络校招前端面经 2020 09 24 面试平台 QQ视频通话 时长 大约半小时 过程 自我介绍 项目问题 项目中遇到的问题以及解决方式 在团队开发过程中个成员合作方式 遇到问题的解决方式 css命名冲突 http和https http
  • PyCharm使用教程(详细版 - 图文结合)

    目录 一 创建项目 二 运行 三 错误提示 四 安装三方包 PyCharm的使用贯穿整个Python的学习 所以单独拿出来出教程不合适 说多了对于新手来说也还是不明白 这里我们先从学习开始前大家需要用到PyCharm的一些功能讲起 后面的p
  • PHP实现用户登录注册(详细教程)

    教程前先给大家看看小编的实现成果吧 图1 图2 图3 教程 实现这个功能我们需要五个php文件 login php 登录界面 如图2
  • unity通过全局事件对项目进行解耦

    一个类要是想调用另一个类的方法 例如A想调用B的方法 方式一 引用 最简单的方式是A持有一个B类的引用 即A拥有一个B的成员对象 方式二 设计模式 中介者模式 或者A和B同属于一个对象C 通过对象C调用对方 中介者模式 例如QQ群 A和B互
  • 如何将二维数组作为函数的参数传递

    今天写程序的时候要用到二维数组作参数传给一个函数 我发现将二维数组作参数进行传递还不是想象得那么简单里 但是最后我也解决了遇到的问题 所以这篇文章主要介绍如何处理二维数组当作参数传递的情况 希望大家不至于再在这上面浪费时间 正文 首先 我引
  • android 弹出式对话框实现自定义菜单栏

    第一步 创建菜单项实体类 Menu 菜单栏选项类 public class Menu 标题 private String title Id 图片Id private int iconID public Menu String title i
  • OpenWrt安装使用教程(x86/64架构)

    什么是OpenWrt 官网简介 OpenWrt项目是一个针对嵌入式设备的Linux操作系统 OpenWrt不是一个单一且不可更改的固件 而是提供了具有软件包管理功能的完全可写的文件系统 这使您可以从供应商提供的应用范围和配置中解脱出来 并且
  • springboot 实现权限管理(一)

    一 背景 1 为什么进行权限管理 生活在形形色色的世界之中 我们各自扮演着各自的角色 拥有不同的权利和义务 映射在计算机系统之中 也一样需要 角色 权限 来进行对用户的分类 限制访问资源 保证资源地合理被使用 使人各司其职 2 应用场景 假
  • 如何生成静态页面的五种方案

    方案1
  • 数据挖掘流程-HCIE-BigData

    机器学习流程 机器学习流程 1 了解需求 确认目标 2 获取数据 3 审阅数据 4 数据分析 4 1 统计分析 4 2 相关性分析 4 3 图形分析 1 散点图 2 热力图 3 直方图 4 统计图 5 柱状图 6 饼图 7 综合绘图 5 数
  • java自动化测试语言高级之泛型

    java自动化测试语言高级之泛型 文章目录 java自动化测试语言高级之泛型 Java 泛型 Java 泛型 Java 泛型 generics 是 JDK 5 中引入的一个新特性 泛型提供了编译时类型安全检测机制 该机制允许程序员在编译时检
  • element plus 使用 icon 图标(两种方式)

    前提 Element UI 和 Element Plus 对 Icon 图标 的使用方式改变较大 在此记录 Element UI Icon 图标 使用CSS 类名方式 Element Plus Icon 图标 使用Vue 组件方式 安装 n
  • -128的补码及原码、反码、补码

    一 原码 一个字节占8位 一个字长为n的机器数能表示不同的数字的个数是固定的2 n个 n 8时2 n 256 用来表示有符号数 数的范围就是 2 n 1 2 n 1 1 n 8时 这个范围就是 128 127 用来表示无符号数 就不需要用一
  • 【异步编程】1. 异步编程的实现方式

    总体介绍 回调函数的方式 使用回调函数的方式有一个缺点是 多个回调函数嵌套的时候会造成回调函数地狱 上下两层的回调函数间的代码耦合度太高 不利于代码的可维护 Promise的方式 使用 Promise 的方式可以将嵌套的回调函数作为链式调用