同步与异步、异步与回调
同步与异步:
function a(){}function b(){}a();b();
以上为同步代码,函数b
必须等函数a
执行完毕后才能执行。
function a(){setTimeout(function(){b();}, 1000);};function c(){};a();c();
首先执行函数a
,而且不等setTimeout
执行就执行函数c
,等待至少1s的时候后才会执行函数b
.实际上在是等待了1s后将函数b
放到了event queue
里面,此时要等待主线程空闲的时候,才会取event queue
里面等待的回调函数
进行执行。
以上是一段简单的异步代码,js里面最基础的异步实现就是调用setTimeout
,setInterval
。
关于js的异步实现请看下面的list:
谈谈javascript的异步实现
回调:
回调函数:在js里面简单点来说,就是函数被当作参数传入另外一个函数当中,并在那个函数中被调用。
var b = function (){//执行相关的代码}var a = function (b){//执行相关的代码b();}a(b);
异步与回调:
大家可能平时听的比较多的是异步回调
,但是必须搞清楚,异步与回调并没有直接的联系,回调只是异步的一种实现方式。
当然还有同步回调,即上面回调部分举的简单的例子。一般使用回调函数主要是将父函数的执行结果通知给回调函数进行处理。
关于异步我的理解是:
因为js是单线程的,如果所有的操作(如ajax操作,获取远程的js文件等IO操作)是同步的,遇到那些耗时的操作,后面的程序必然被阻塞不能执行,页面也就失去了响应。因此js采用了事件驱动机制,在单线程模型下,使用异步回调函数的方式来实现非阻塞的IO操作。
异步任务
是指js在主线程(stack
)运行的过程当中,当stack
空闲的时候,主线程对event queque
轮询(事实上一直在轮询)后,将异步任务放到stack
里面进行执行。简单点说,只要指定过回调函数,那么当这些事件发生的时候就会进入事件队列
,等待主线程的stack
空闲的时候,就会对event queue
里面的回调读取并放到stack里面执行。
看一段ajax实现的代码:
var xhr = new XMLHttpRequest();xhr.open('POST', url, true); //第三个参数决定是否采用异步的方式xhr.send(data);xhr.onreadystatechange = function(){if(xhr.readystate === 4 && xhr.status === 200){///xxxx}}
这里ajax请求是异步
的,因为浏览器会新开一个线程请求,当请求的状态(readystate)
发生改变,因为之前就设置了回调函数,每次状态发生改变都会调用相应的回调函数,当(xhr.readystate === 4 && xhr.status === 200)
的时候,回调函数进入了event queue
,等待主线程空闲的时候,并且event queue
里面排在这个回调前面没有其他回调的时候就会得到执行。
异步回调产生的结果就是,函数的调用并不直接返回结果,而往往是交给回调函数进行异步处理。
因此在异步编程当中,需要注意几个地方:
需要把依赖于异步函数(需要其执行结果或者达到某种状态)的代码放在对应的回调函数中(例如上面的ajax的例子)
异步函数后面的代码会立即执行(因此需要知道某段代码是否为异步的)
另外还有一个关于script标签异步加载的内容:
大家记得请求远程脚本标签吗?
<script src='xxxx' async></script>
在script标签里面加入了async属性或者defer属性后,同样变成了异步了。
关于这部分的内容,请移步:
async和defer的区别
另外关于这部分的内容还有一些List:
并发模型与event loop
朴灵评阮老师的event loop
同步与异步、异步与回调相关推荐
- ajax 同步_第3部分-0:同步和异步,还有回调需要了解一下
同步是什么 异步是什么 异步场景: (1)定时任务 (2)网络请求:Ajax .图片加载 全面分析前端的网络请求方式 (3)事件绑定 异步产生知识点: 进程和线程 单线程 记一次 Vue 移动端活动倒 ...
- 软件中的1、同步调用;2、回调;3、异步调用
软件模块中存在一定接口,从调用方式上分为三类 1.同步调用:2.回调:3.异步调用 首先,同步调用是一种阻塞式调用,调用方要等待对象执行完毕才返回.它是一种单向调用. 其次,回调是一种双向调用模式,也 ...
- C#(同步调用、异步调用、异步回调)
本文将主要通过"同步调用"."异步调用"."异步回调"三个示例来讲解在用委托执行同一个"加法类"的时候的的区别和利弊. ...
- C#“同步调用”、“异步调用”、“异步回调”
本文将主要通过"同步调用"."异步调用"."异步回调"三个示例来讲解在用委托执行同一个"加法类"的时候的的区别和利弊. ...
- C# 委托(同步调用、异步调用、异步回调)
文章转自:http://www.csharpwin.com/csharpspace/12393r3151.shtml 本文将主要通过"同步调用"."异步调用". ...
- 【JavaScript】同步与异步-异步与并行-异步运行机制-为什么要异步编程-异步与回调-回调地狱-JavaScript中的异步操作
文章目录 1. 同步与异步 1.1 同步行为synchronous 1.1.1 特点 1.1.2 例子 1.2 异步行为asynchronous 1.2.1 必要性 1.2.2 特点 1.2.3 例子 ...
- js回调执行顺序,同步任务与异步任务,宏任务与微任务
JS执行顺序 JS是单线程的,即一段时间只能执行一个任务.执行一段代码,js总是按照顺序执行的,只不过在执行的过程中不会等待异步任务. 同步任务与异步任务 同步任务:立即执行的任务,直接被主线程读取并 ...
- asio boost 异步错误处理_boost::ASIO的同步方式和异步方式
http://blog.csdn.net/zhuky/article/details/5364574 http://blog.csdn.net/zhuky/article/details/536468 ...
- 【OkHttp】OkHttp Get 和 Post 请求 ( 同步 Get 请求 | 异步 Get 请求 | 同步 Post 请求 | 异步 Post 请求 )
OkHttp 系列文章目录 [OkHttp]OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) [OkHttp]Android 项目导入 OkHttp ( 配置依赖 | 配置 ...
- 【多线程】0.理解一下5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO
5种IO模型.阻塞IO和非阻塞IO.同步IO和异步IO 看了一些文章,发现有很多不同的理解,可能是因为大家入切的角度.环境不一样.所以,我们先说明基本的IO操作及环境. 本文是在<UNIX网络编 ...
最新文章
- SAP MM GR-based IV, 无GR不能IV?
- 远洋整站下载器不能用https_这可能是最全最好的爆破百度文库下载指南了!
- Python dataframe绘制饼图_【python可视化】:matplotlib:常见图表绘制——面积图、填图、饼图...
- Career Essentials Postgraduate Study: exploring your options 读完本科后干啥?
- python 遍历目录或文件
- Matlab---傅里叶变换---通俗理解(一)
- intelij不识别java文件
- Caffe自己修改训练方法
- java获取类名不包括路径
- 分布式系统:CAP 理论的前世今生
- 6400万像素时代来了,小米首个入局
- wifi 小米pro 驱动 黑苹果_macOS安装教程兼小米Pro安装过程记录
- Linux档案与目录管理
- 等级保护三级信息系统安全设计
- oracle怎么拼接数据,拼接oracle数据
- 人工智能系列:AI 赋能平台
- python蒙特卡洛模拟return_蒙特卡罗方法入门
- 怎样将优酷网站下载的视频KUX转MP4格式
- android横屏ui,换个角度看风景 手机产品UI设计之横屏模式(2)
- java输出abba_java - 有限状态机搜索“ABBA” - 堆栈内存溢出
热门文章
- 读 《.Net 之美》解析.Net Remoting (应用程序域)-- Part.1
- C# sqlDataReader区别Dataset
- 让Apache日志不记录图片等指定扩展名文件的设置方法
- 判断用户什么时候离开,以什么方式离开
- Java开发笔记(一百四十一)JavaFX的列表与表格
- struts2 获取前台表单的值?? 原理??
- python解析XML:之二 (ElementTree)
- 子窗口和父窗口交互 (转)
- python 定义一个学生类、包含三个属性并打印输出_Python3.x基础学习-类--面向对象...
- STORM的三种事务