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

js同步和异步

同步和异步

异步并不是同步,异步是单线程,异步指的是让CPU暂时搁置当前请求的响应,处理下一个请求,当通过轮询或其他方式得到回调通知后,开始运行。

并发是多线程,

 同步:一定要等任务执行完了,得到结果,才执行下一个任务。
 异步:不等任务执行完,直接执行下一个任务。

简而言之,言而总之:同步就是我强依赖你(对方),我必须等到你的回复,才能做出下一步响应。即我的操作(行程)是顺序执行的,中间少了哪一步都不可以,或者说中间哪一步出错都不可以,类似于编程中程序被解释器顺序执行一样;同时如果我没有收到你的回复,我就一直处于等待、也就是阻塞的状态。 异步则相反,我并不强依赖你,我对你响应的时间也不敏感,无论你返回还是不返回,我都能继续运行;你响应并返回了,我就继续做之前的事情,你没有响应,我就做其他的事情。也就是说我不存在等待对方的概念,我就是非阻塞的。

我们先不深入异步概念,先从「表象」来看看怎么样的代码是异步代码:

异步代码的书写顺序与执行顺序不同。

区别: 会不会阻塞当前程序运行

什么时候需要异步:

(1)需要等待的时候,等待过程不能卡在这吧

(2)等待过程不像alert一样阻塞程序运行

(3)等待的情况都要异步

使用异步的场景:

(1)定时任务,setTimeout,setInterval

(2)网络请求: ajax请求,动态<img>加载

(3)事件绑定,点击等交互事件

 

 

 

几个问题:

1. 同步和异步的区别是什么

   同步阻塞代码运行,alert是同步,setTimeout是异步

2. 一个setTimeout的例子

JS引擎扫描一遍,将事件按顺序加入任务队列,然后执行,此时注意setTimeout中的函数是在定时完成后才会加入队列

所以刚开始队列中 有 console.log(1),setTimeout(fn1,0),console.log(3),setTimeout(fn2,1000),console.log(5)

输出1,执行setTimeout后,再过0ms将fn1加入到任务队列尾部,此时队列中有console.log(3),setTimeout(fn2,1000),console.log(5),fn1

再输出3,执行setTimeout,过了1000ms将fn2加到任务队列尾部,输出5,再执行fn1,fn2

事件执行过程中的事件循环,JS引擎有个运行栈,不断从任务队列里读取任务运行,运行栈为空,便检查任务队列,一直加入,循环往复,直至任务队列也为空

什么情况下需要用到异步?

现在有三个函数,taskA()、taskB() 和 taskC(),三个任务互不影响

taskA 和 taskC 执行得很快,但是 taskB 执行需要 10 秒钟。

// 同步的写法
function taskB(){
  var response = $.ajax({
    url:"/data.json",
    async: false // 注意这里 async 为 false,表示是同步
  })
  return response // 十秒钟后,返回 response
}
 
taskA()
taskB()
taskC()

 

taskC 一定要等 taskB 执行完了才能执行,这就是同步。

执行顺序为:

A -> B -> AJAX 请求 -> C ---------------------------

现在换成异步:

// 异步的写法
function taskB(){
  var result = $.ajax({
    url:"/data.json",
    async: true // 异步
  })
  return result // 一定要注意,现在的 result 不是上面的 response
}
taskA()
taskB()
taskC()

 

这样写之后,执行顺序就是

  1.  
    A -> B -> C ---------------------------------------
  2.  
    -> AJAX 请求 --------------------------------

就是说 AJAX 请求和任务C 同时执行。

但是请注意执行的主体。AJAX 请求是由浏览器的网络请求模块执行的,taskC 是由 JS 引擎执行的。

综上,如果几个任务互相独立,其中一个执行时间较长,那么一般就用异步地方式做这件事。

所以像setTimeOut定时任务、ajax请求都是需要一定的时间的,所以一般都是用异步方式,不会阻塞后边代码的执行,而是设置了定时时间之后、或发送了请求之后,就移动到单线程的任务队列的最尾端,等后边执行完之后再执行定时代码或者ajax请求的回调函数内代码。

JS 引擎不能同时做两件事

有些人说异步是同时做两件事,但其实 JS 引擎不会这样。

以 setTimeout 为例,setTimeout 里面的代码一定会在当前环境中的任务执行完了「之后」才执行。

异步意味着不等待任务结束,并没有强制要求两个任务「同时」进行。

但是 AJAX 请求是可以与 JS 代码同时进行的,因为这个请求不是由 JS 引擎负责,而是由浏览器网络模块负责。

以上,就是异步的简介。

转载于:https://www.cnblogs.com/zhaoyanhaoBlog/p/11296223.html

相关文章:

  • 并发并行同步异步多线程
  • 猿辅导 2019年 校招提前批笔试
  • RequireJs入门
  • Asp.net页面的生命周期
  • 终于弄好了 homework-09
  • python面向对象
  • leetcode 337. House Robber III
  • Durandal入门
  • js中使用EL表达式总结
  • leetcode 309. Best Time to Buy and Sell Stock with Cooldown
  • 环境变量
  • 手机端和网页端使用同一后台时进行会话控制
  • SpringBoot起步
  • 获取当前python 解释器的路径=.=
  • $.proxy和$.extend
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • bootstrap创建登录注册页面
  • Bytom交易说明(账户管理模式)
  • canvas 五子棋游戏
  • JS+CSS实现数字滚动
  • magento 货币换算
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Promise面试题2实现异步串行执行
  • React系列之 Redux 架构模式
  • Vue 2.3、2.4 知识点小结
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 对JS继承的一点思考
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 关于for循环的简单归纳
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 思考 CSS 架构
  • 微信小程序实战练习(仿五洲到家微信版)
  • 小程序01:wepy框架整合iview webapp UI
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 终端用户监控:真实用户监控还是模拟监控?
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (3)llvm ir转换过程
  • (Note)C++中的继承方式
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • ./configure,make,make install的作用
  • .net 7 上传文件踩坑
  • .Net IE10 _doPostBack 未定义
  • .NET导入Excel数据
  • .net分布式压力测试工具(Beetle.DT)
  • /dev/sda2 is mounted; will not make a filesystem here!
  • @Transactional类内部访问失效原因详解
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛