详解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 相关文章推荐
一个封装js代码-----展开收起效果示例
Jul 03 Javascript
JavaScript的jQuery库中ready方法的学习教程
Aug 14 Javascript
JS控制按钮10秒钟后可用的方法
Dec 22 Javascript
JavaScript、jQuery与Ajax的关系
Jan 24 Javascript
JS中的hasOwnProperty()、propertyIsEnumerable()和isPrototypeOf()
Aug 11 Javascript
jquery插件bootstrapValidator数据验证详解
Nov 09 Javascript
基于JQuery的购物车添加删除以及结算功能示例
Mar 08 Javascript
JS解析url查询参数的简单代码
Aug 06 Javascript
纯js实现页面返回顶部的动画(超简单)
Aug 10 Javascript
webpack file-loader和url-loader的区别
Jan 15 Javascript
微信小程序学习笔记之获取位置信息操作图文详解
Mar 29 Javascript
Vue.js中v-bind指令的用法介绍
Mar 13 Vue.js
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
yii框架搜索分页modle写法
2016/12/19 PHP
PHP中大括号'{}'用法实例总结
2017/02/08 PHP
PHP中上传文件打印错误错误类型分析
2019/04/14 PHP
JavaScript 开发中规范性的一点感想
2009/06/23 Javascript
关于jQuery UI 使用心得及技巧
2012/10/10 Javascript
基于jQuery实现音乐播放试听列表
2016/04/14 Javascript
使用jQuery加载html页面到指定的div实现方法
2016/07/13 Javascript
基于AngularJS实现的工资计算器实例
2017/06/16 Javascript
ZeroClipboard.js使用一个flash复制多个文本框
2017/06/19 Javascript
jQuery Ajax 实现分页 kkpager插件实例代码
2017/08/10 jQuery
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
2017/10/21 Javascript
JS运动特效之任意值添加运动的方法分析
2018/01/24 Javascript
浅谈node.js 命令行工具(cli)
2018/05/10 Javascript
详解vue填坑之解决部分浏览器不支持pushState方法
2018/07/12 Javascript
JavaScript实现shuffle数组洗牌操作示例
2019/01/03 Javascript
详解基于Wepy开发小程序插件(推荐)
2019/08/01 Javascript
vue学习笔记之给组件绑定原生事件操作示例
2020/02/27 Javascript
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
2020/07/27 Javascript
[00:43]FTP典藏礼包 DOTA2三大英雄霸气新套装
2014/03/21 DOTA
Python的socket模块源码中的一些实现要点分析
2016/06/06 Python
Python的collections模块中的OrderedDict有序字典
2016/07/07 Python
使用django-crontab实现定时任务的示例
2018/02/26 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
python 3.6.2 安装配置方法图文教程
2018/09/18 Python
python可视化实现代码
2019/01/15 Python
使用TFRecord存取多个数据案例
2020/02/17 Python
Python制作数据预测集成工具(值得收藏)
2020/08/21 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
宝拉珍选英国官网:Paula’s Choice英国
2019/05/29 全球购物
支行行长竞聘演讲稿
2014/05/15 职场文书
售房协议书
2014/08/19 职场文书
自主招生学校推荐信
2014/09/26 职场文书
部队个人年终总结
2015/03/02 职场文书
2015学校六五普法工作总结
2015/04/22 职场文书
国庆阅兵观后感
2015/06/15 职场文书
MySQL中order by的使用详情
2021/11/17 MySQL