当前位置: 首页 > news >正文

JavaScript(三):理解异步

理解异步

  • 1、概述
  • 2、异步
    • 2.1、setTimeout()函数小试
    • 2.2、异步函数存在的合理性与必然性
    • 2.3、能自己设计异步函数吗
    • 2.4、回调与异步的关系
  • 3、总结

1、概述

大家好,我是欧阳方超。
已经介绍完回调函数了,现实中,我们经常在异步函数中使用回调函数。setTimeout()就是一个典型的异步函数。那就先学着使用一下setTimeout()函数,再来理解异步的概念吧。

2、异步

2.1、setTimeout()函数小试

下面的代码中,ringTheBell()函数作为回调函数传给setTimeout()函数,5秒后ringTheBell()被调用。

setTimeout(ringTheBell, 5000)
  
      function ringTheBell() {
          console.log("时间到");
      }

上面代码还有两种写法,就是把ringTheBell()函数直接以匿名函数或箭头函数的形式写在setTimeout()的参数处,如下:

//匿名函数
setTimeout(function() {
          console.log("时间到");
      }, 5000)

//箭头函数
setTimeout(()=>{
          console.log("时间到");
      }, 5000)

需要说明的是,如果setTimeout()后面还有任务要执行的话,这里的任务是不会等待5秒再执行的,而是调用完setTimeout()后立即执行,从这也可以初步体会到异步的含义。

2.2、异步函数存在的合理性与必然性

我们先看一个稍微规范点的对异步编程的定义:异步编程允许程序在执行一个耗时较长的任务时,继续对其他事件做出反应而不用等待该耗时任务完成,一旦耗时的任务运行完成,程序可以得到它的结果。

处理耗时常的任务时对其他事件依然有做出反应的能力,这道出了异步函数存在的必然性,因为JavaScript中有很多函数都比较耗时,比如浏览器提供的fetch()、getUserMedia()、showOpenFilePicker()等,如果不设计成异步的,当遇到某个任务非常耗时时,浏览器将不会响应用户的操作,势必带来较差的体验。所以,可以这么简单地理解——异步函数就是解决耗时的同步函数而产生的。

概括地讲,异步函数可以为我们提供如下能力:
调用一个函数来执行耗时较长的操作;
函数可以立即返回,使得程序可以继续响应其他事件;
当耗时较长的操作执行完毕时,可以通知程序执行的结果;

2.3、能自己设计异步函数吗

能自己设计异步函数吗?这个理论上是可以的!但是会涉及到浏览器引擎一类的技术,所以“普通用户”还是使用已经封装好的异步函数即可,如setTimeout()、XMLHttpRequest相关函数,可以通过调用这些函数间接实现想要的异步效果。当然后来又引入了async关键字来声明一个异步函数。

2.4、回调与异步的关系

回调并不一定就是异步,他们之间并没有直接的关系,只不过回调函数可以用来处理异步函数的执行结果,使用回到函数的地方,程序执行流程可以是同步的也可以是异步的。

3、总结

诸如网络请求之类的操作耗时较长,通常以异步函数的形式来执行这类操作,当耗时长的操作完成以后又需要使用回调函数对结果进行处理,所以会经常在异步函数中使用回调函数,异步函数与回调函数此时珠联璧合。
我是欧阳方超,把事情做好了自然就有兴趣了,如果你喜欢我的文章,欢迎点赞、转发、评论加关注。

相关文章:

  • JVM阶段(3)-OutOfMemoryError异常
  • 企业运维容器之 docker 网络
  • 【QML】 如何导入QML文档目录
  • 【前端】命令行基础,linux常用命令
  • 【ZYNQ-嵌入式】zynq学习笔记(二)—— GIPO的硬件配置和软件配置
  • vue echarts 镂空饼图配置
  • 项目二:《贪吃蛇》
  • 企业运维容器之 docker仓库
  • 快速排序sort 第k个数
  • uniapp开发微信小程序Error in onLoad hook: “SyntaxError: Unexpected end of JSON input“
  • MySQL当前链接状态查询
  • 打破平台限制,小程序如何在硬件设备上运行?
  • ORA-01017(:用户名/口令无效; 登录被拒绝)Oracle新建用户并授权
  • PostgreSQL的学习心得和知识总结(九十九)|语法级自上而下完美实现达梦数据库的 TOP语法功能 的实现方案
  • Mybatis-Plus批量插入应该怎么用
  • [译]如何构建服务器端web组件,为何要构建?
  • Cumulo 的 ClojureScript 模块已经成型
  • egg(89)--egg之redis的发布和订阅
  • javascript 哈希表
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • oschina
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Shell编程
  • Spring Cloud Feign的两种使用姿势
  • Xmanager 远程桌面 CentOS 7
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 高性能JavaScript阅读简记(三)
  • 如何实现 font-size 的响应式
  • 微信支付JSAPI,实测!终极方案
  • 译自由幺半群
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​2021半年盘点,不想你错过的重磅新书
  • ​Spring Boot 分片上传文件
  • #宝哥教你#查看jquery绑定的事件函数
  • #每天一道面试题# 什么是MySQL的回表查询
  • %check_box% in rails :coditions={:has_many , :through}
  • (libusb) usb口自动刷新
  • (搬运以学习)flask 上下文的实现
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (译)2019年前端性能优化清单 — 下篇
  • (转)Linq学习笔记
  • (转)创业家杂志:UCWEB天使第一步
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET Core Web APi类库如何内嵌运行?
  • .Net Core与存储过程(一)
  • .net Stream篇(六)
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .Net 应用中使用dot trace进行性能诊断
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...