详解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的jqDnR拖拽溢出的修改
Feb 12 Javascript
基于javascript的COOkie的操作实现只能点一次
Dec 26 Javascript
AngularJS中监视Scope变量以及外部调用Scope方法
Jan 23 Javascript
JavaScript预解析及相关技巧分析
Apr 21 Javascript
如何检测JavaScript的各种类型
Jul 30 Javascript
jQuery日期范围选择器附源码下载
May 23 jQuery
VUE中v-model和v-for指令详解
Jun 23 Javascript
node.js学习之事件模块Events的使用示例
Sep 28 Javascript
react实现换肤功能的示例代码
Aug 14 Javascript
JS实现小星星特效
Dec 24 Javascript
vue-cli3单页构建大型项目方案
Apr 07 Javascript
微信小程序开发之获取用户手机号码(php接口解密)
May 17 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学习笔记 类的声明与对象实例化
2011/06/13 PHP
PHP删除HTMl标签的三种解决方法
2013/06/30 PHP
PHP输出当前进程所有变量/常量/模块/函数/类的示例
2013/11/07 PHP
smarty模板局部缓存方法使用示例
2014/06/17 PHP
PHP调用Mailgun发送邮件的方法
2017/05/04 PHP
PHP的mysqli_stmt_init()函数讲解
2019/01/24 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
2019/04/15 PHP
laravel http 自定义公共验证和响应的方法
2019/09/29 PHP
Jquery 的扩展方法总结
2011/10/01 Javascript
jQuery中parents()和parent()的区别分析
2014/10/28 Javascript
node.js中的fs.chown方法使用说明
2014/12/16 Javascript
实例讲解js验证表单项是否为空的方法
2016/01/09 Javascript
鼠标悬停小图标显示大图标
2016/01/22 Javascript
探索angularjs+requirejs全面实现按需加载的套路
2016/02/26 Javascript
JS 实现倒计时数字时钟效果【附实例代码】
2016/03/30 Javascript
深入理解JavaScript的async/await
2018/08/05 Javascript
vue实现图片按比例缩放问题操作
2020/08/11 Javascript
django中的setting最佳配置小结
2017/11/21 Python
python读取与写入csv格式文件的示例代码
2017/12/16 Python
Python实现的读写json文件功能示例
2018/06/05 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
2018/08/31 Python
Django实现表单验证
2018/09/08 Python
详解python分布式进程
2018/10/08 Python
python使用selenium实现批量文件下载
2019/03/11 Python
python+openCV利用摄像头实现人员活动检测
2019/06/22 Python
python计算n的阶乘的方法代码
2019/10/25 Python
在python shell中运行python文件的实现
2019/12/21 Python
python进行参数传递的方法
2020/05/12 Python
python求numpy中array按列非零元素的平均值案例
2020/06/08 Python
SNIDEL官网:日本VIVI杂志人气少女第一品牌
2020/03/12 全球购物
团日活动总结书格式
2014/05/08 职场文书
民政局个人整改措施
2014/09/24 职场文书
镇党委书记群众路线整改措施思想汇报
2014/10/13 职场文书
会计稽核岗位职责
2015/04/13 职场文书
多人股份制合作协议书
2016/03/19 职场文书
导游词之藏龙百瀑景区
2019/12/30 职场文书