详解JavaScript 异步编程


Posted in Javascript onJuly 13, 2020

异步的概念

异步(Asynchronous, async)是与同步(Synchronous, sync)相对的概念。

在我们学习的传统单线程编程中,程序的运行是同步的(同步不意味着所有步骤同时运行,而是指步骤在一个控制流序列中按顺序执行)。而异步的概念则是不保证同步的概念,也就是说,一个异步过程的执行将不再与原有的序列有顺序关系。

简单来理解就是:同步按你的代码顺序执行,异步不按照代码顺序执行,异步的执行效果更高:

以上是关于异步的概念的解释,接下来我们通俗地解释一下异步:异步就是从主线程发射一个子线程来完成任务。

详解JavaScript 异步编程

什么时候用异步编程

在前端编程中(甚至后端有时也是这样),我们在处理一些简短、快速的操作时,例如计算 1 + 1 的结果,往往在主线程中就可以完成。主线程作为一个线程,不能够同时接受多方面的请求。所以,当一个事件没有结束时,界面将无法处理其他请求。

现在有一个按钮,如果我们设置它的 onclick 事件为一个死循环,那么当这个按钮按下,整个网页将失去响应。

为了避免这种情况的发生,我们常常用子线程来完成一些可能消耗时间足够长以至于被用户察觉的事情,比如读取一个大文件或者发出一个网络请求。因为子线程独立于主线程,所以即使出现阻塞也不会影响主线程的运行。但是子线程有一个局限:一旦发射了以后就会与主线程失去同步,我们无法确定它的结束,如果结束之后需要处理一些事情,比如处理来自服务器的信息,我们是无法将它合并到主线程中去的。

为了解决这个问题,JavaScript 中的异步操作函数往往通过回调函数来实现异步任务的结果处理。

回调函数

回调函数就是一个函数,它是在我们启动一个异步任务的时候就告诉它:等你完成了这个任务之后要干什么。这样一来主线程几乎不用关心异步任务的状态了,他自己会善始善终。

实例

function print() {
 document.getElementById("demo").innerHTML="JB51!";
}
setTimeout(print, 3000);

效果图

详解JavaScript 异步编程

这段程序中的 setTimeout 就是一个消耗时间较长(3 秒)的过程,它的第一个参数是个回调函数,第二个参数是毫秒数,这个函数执行之后会产生一个子线程,子线程会等待 3 秒,然后执行回调函数 "print",在命令行输出 "Time out"。

当然,JavaScript 语法十分友好,我们不必单独定义一个函数 print ,我们常常将上面的程序写成:

setTimeout(function () {
 document.getElementById("demo").innerHTML="JB51!";
}, 3000);

注意:既然 setTimeout 会在子线程中等待 3 秒,在 setTimeout 函数执行之后主线程并没有停止,所以:

setTimeout(function () {
 console.log("1");
}, 1000);
console.log("2");

这段程序的执行结果是:

2
1

异步 AJAX

除了 setTimeout 函数以外,异步回调广泛应用于 AJAX 编程。有关于 AJAX 详细请参见:https://3water.com/article/80686.htm

XMLHttpRequest 常常用于请求来自远程服务器上的 XML 或 JSON 数据。一个标准的 XMLHttpRequest 对象往往包含多个回调:

var xhr = new XMLHttpRequest();
 
xhr.onload = function () {
 // 输出接收到的文字数据
 document.getElementById("demo").innerHTML=xhr.responseText;
}
 
xhr.onerror = function () {
 document.getElementById("demo").innerHTML="请求出错";
}
 
// 发送异步 GET 请求
xhr.open("GET", "https://www.runoob.com/try/ajax/ajax_info.txt", true);
xhr.send();

XMLHttpRequest 的 onload 和 onerror 属性都是函数,分别在它请求成功和请求失败时被调用。如果你使用完整的 jQuery 库,也可以更加优雅的使用异步 AJAX:

$.get("https://www.runoob.com/try/ajax/demo_test.php",function(data,status){
 alert("数据: " + data + "\n状态: " + status);
});

以上就是详解JavaScript 异步编程的详细内容,更多关于JavaScript 异步编程的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
跟着JQuery API学Jquery 之三 筛选
Apr 09 Javascript
jquery datepicker参数介绍和示例
Apr 15 Javascript
jQuery实现预加载图片的方法
Mar 17 Javascript
JScript中的条件注释详解
Apr 24 Javascript
JS实现灵巧的下拉导航效果代码
Aug 25 Javascript
微信小程序 LOL 英雄介绍开发实例
Sep 30 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
Nov 07 Javascript
100多个基础常用JS函数和语法集合大全
Feb 16 Javascript
vuex实现登录状态的存储,未登录状态不允许浏览的方法
Mar 09 Javascript
微信小程序中实现手指缩放图片的示例代码
Mar 13 Javascript
vue-router beforeEach跳转路由验证用户登录状态
Dec 26 Javascript
LayUI+Shiro实现动态菜单并记住菜单收展的示例
May 06 Javascript
javascript canvas时钟模拟器
Jul 13 #Javascript
微信小程序整个页面的自动适应布局的实现
Jul 12 #Javascript
uniapp 仿微信的右边下拉选择弹出框的实现代码
Jul 12 #Javascript
微信小程序实现列表滚动头部吸顶的示例代码
Jul 12 #Javascript
Js on及addEventListener原理用法区别解析
Jul 11 #Javascript
JS call()及apply()方法使用实例汇总
Jul 11 #Javascript
JS如何定义用字符串拼接的变量
Jul 11 #Javascript
You might like
php的memcached客户端memcached
2011/06/14 PHP
PHP实现微信公众平台音乐点播
2014/03/20 PHP
实例讲解PHP面向对象之多态
2014/08/20 PHP
php实现统计网站在线人数的方法
2015/05/12 PHP
自适应图片大小的弹出窗口
2006/07/27 Javascript
JSON传递bool类型数据的处理方式介绍
2013/09/18 Javascript
使用jquery解析XML示例代码
2014/09/05 Javascript
实现图片预加载的三大方法及优缺点分析
2014/11/19 Javascript
jQuery中live()方法用法实例
2015/01/19 Javascript
JQuery CheckBox(复选框)操作方法汇总
2015/04/15 Javascript
手机开发必备技巧:javascript及CSS功能代码分享
2015/05/25 Javascript
【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
2016/06/07 Javascript
canvas绘制环形进度条
2017/02/23 Javascript
浅谈AngularJs 双向绑定原理(数据绑定机制)
2017/12/07 Javascript
vue单个组件实现无限层级多选菜单功能
2018/04/10 Javascript
Layui组件Table绑定行点击事件和获取行数据的方法
2018/08/19 Javascript
详解key在Vue列表渲染时究竟起到了什么作用
2019/04/20 Javascript
[01:42]TI4西雅图DOTA2前线报道 第一顿早饭哦
2014/07/08 DOTA
python生成随机验证码(中文验证码)示例
2014/04/03 Python
Python实现的飞速中文网小说下载脚本
2015/04/23 Python
常见python正则用法的简单实例
2016/06/21 Python
python if not in 多条件判断代码
2016/09/21 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
Python 实现简单的客户端认证
2020/07/29 Python
Python爬虫抓取论坛关键字过程解析
2020/10/19 Python
万得城电器土耳其网站:欧洲第一大电子产品零售商
2016/10/07 全球购物
美国大码时尚女装购物网站:ELOQUII
2017/12/28 全球购物
波兰汽车配件网上商店:iParts.pl
2020/09/08 全球购物
掌上明珠Java程序员面试总结
2016/02/23 面试题
卫校护理专业毕业生求职信
2013/11/26 职场文书
家长对孩子的感言
2014/03/10 职场文书
2015年上半年信访工作总结
2015/03/30 职场文书
2015初一年级组工作总结
2015/07/24 职场文书
十大必看国产动漫排名,魁拔上线,第二曾在日本播出
2022/03/18 国漫
python使用BeautifulSoup 解析HTML
2022/04/24 Python
详解ZABBIX监控ESXI主机的问题
2022/06/21 Servers