详解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获得页面的高度和宽度的方法
Feb 23 Javascript
jQuery实现文本框邮箱输入自动补全效果
Nov 17 Javascript
JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法
Apr 18 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【二】
May 10 Javascript
微信小程序 wx.uploadFile无法上传解决办法
Dec 14 Javascript
原生js实现可爱糖果数字时间特效
Dec 30 Javascript
jquery操作select取值赋值与设置选中实例
Feb 28 Javascript
JQuery样式操作、click事件以及索引值-选项卡应用示例
May 14 jQuery
vue前后分离调起微信支付
Jul 29 Javascript
如何阻止小程序遮罩层下方图层滚动
Sep 05 Javascript
vue-router 中 meta的用法详解
Nov 01 Javascript
JS实现随机点名器
Apr 12 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 之入门篇
2006/12/04 PHP
linux php mysql数据库备份实现代码
2009/03/10 PHP
php在window iis的莫名问题的测试方法
2013/05/14 PHP
PHP PDOStatement::fetchAll讲解
2019/01/31 PHP
浅析PHP中json_encode与json_decode的区别
2020/07/15 PHP
JavaScript高级程序设计(第3版)学习笔记8 js函数(中)
2012/10/11 Javascript
javascript 密码框防止用户粘贴和复制的实现代码
2014/02/17 Javascript
完美兼容IE,chrome,ff的设为首页、加入收藏及保存到桌面js代码
2014/12/17 Javascript
js仿土豆网带缩略图的焦点图片切换效果实现方法
2015/02/23 Javascript
javascript事件冒泡实例分析
2015/05/13 Javascript
Javascript动态创建表格及删除行列的方法
2015/05/15 Javascript
JavaScript实现强制重定向至HTTPS页面
2015/06/10 Javascript
JavaScript中的getMilliseconds()方法使用详解
2015/06/10 Javascript
JavaScript脚本库编写的方法
2015/12/09 Javascript
JavaScript获取当前cpu使用率的方法
2015/12/15 Javascript
JavaScript中return用法示例
2016/11/29 Javascript
一次记住JavaScript的6个正则表达式方法
2018/02/22 Javascript
修改Nodejs内置的npm默认配置路径方法
2018/05/13 NodeJs
微信小程序扫描二维码获取信息实例详解
2019/05/07 Javascript
微信小程序和H5页面间相互跳转代码实例
2019/09/19 Javascript
在Python中操作列表之List.append()方法的使用
2015/05/20 Python
Python实现批量下载图片的方法
2015/07/08 Python
详解Python验证码识别
2016/01/25 Python
PyQt5利用QPainter绘制各种图形的实例
2017/10/19 Python
python中数据爬虫requests库使用方法详解
2018/02/11 Python
python pandas cumsum求累计次数的用法
2019/07/29 Python
python实现LRU热点缓存及原理
2019/10/29 Python
惠普美国官方商店:HP Official Store
2016/08/28 全球购物
18-35岁旅游团的全球领导者:Contiki
2017/02/08 全球购物
Expedia丹麦:全球领先的旅游网站
2018/03/18 全球购物
新加坡领先的在线生活方式和杂货购物网站:EAMART
2019/04/02 全球购物
2014年群众路线党员自我评议
2014/09/24 职场文书
社区扶贫帮困工作总结
2015/05/20 职场文书
2016年大学生实习单位评语
2015/12/01 职场文书
Spring Boot接口定义和全局异常统一处理
2022/04/20 Java/Android
JavaScript parseInt0.0000005打印5原理解析
2022/07/23 Javascript