浅谈js的异步执行


Posted in Javascript onOctober 18, 2016

1.Javascript语言的执行环境是”单线程”(single thread):

优点:实现起来比较简单,执行环境相对单纯;

缺点:只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行。常见的浏览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地方,其他任务无法执行。

为了解决这个问题,Javascript语言将任务的执行模式分成两种:同步(Synchronous)和异步(Asynchronous)。

2.”异步模式”编程的几种方法:

(1)回调函数:优点是简单、容易理解和部署,缺点是不利于代码的阅读和维护,各个部分之间高度耦合(Coupling),使得程序结构混乱、流程难以追踪(尤其是回调函数嵌套的情况),而且每个任务只能指定一个回调函数。

(2)采用事件驱动模式(事件监听):优点是比较容易理解,可以绑定多个事件,每个事件可以指定多个回调函数,而且可以”去耦合“(Decoupling),有利于实现模块化。缺点是整个程序都要变成事件驱动型,运行流程会变得很不清晰。

(3)观察者模式(发布\订阅模式):这种方法的性质与”事件监听”类似,但是明显优于后者。因为我们可以通过查看”消息中心”,了解存在多少信号、每个信号有多少订阅者,从而监控程序的运行。

3.异步操作的流程控制。

(1)串行执行:编写一个流程控制函数,让它来控制异步任务,一个任务完成以后,再执行另一个。

var items = [ 1, 2, 3, 4, 5, 6 ];
var results = [];
function series(item) {
 if(item) {
  async( item, function(result) {
   results.push(result);
   return series(items.shift());
  });
 } else {
  return final(results);
 }
}
series(items.shift());

函数series就是串行函数,它会依次执行异步任务,所有任务都完成后,才会执行final函数。items数组保存每一个异步任务的参数,results数组保存每一个异步任务的运行结果。

(2)并行执行:所有异步任务同时执行,等到全部完成以后,才执行final函数。

//forEach方法会同时发起6个异步任务,等到它们全部完成以后,才会执行final函数。
var items = [ 1, 2, 3, 4, 5, 6 ];
var results = [];

items.forEach(function(item) {
 async(item, function(result){
  results.push(result);
  if(results.length == items.length) {
   final(results);
  }
 })
});

并行执行的好处是效率较高,比起串行执行一次只能执行一个任务,较为节约时间。但是问题在于如果并行的任务较多,很容易耗尽系统资源,拖慢运行速度。因此有了第三种流程控制方式。

(3)并行与串行的结合:设置一个门槛,每次最多只能并行执行n个异步任务。这样就避免了过分占用系统资源。

//变量running记录当前正在运行的任务数,只要低于门槛值,就再启动一个新的任务
//如果等于0,就表示所有任务都执行完了,这时就执行final函数
//最多只能同时运行两个异步任务。
var items = [ 1, 2, 3, 4, 5, 6 ];
var results = [];
var running = 0;
var limit = 2;

function launcher() {
  while(running < limit && items.length > 0) {
    var item = items.shift();
    async(item, function(result) {
      results.push(result);
      running++;
      if(items.length > 0) {
        launcher();
      }
    });
    running--;
    if(running == 0) {
      final();
    }
  }
}

以上就是小编为大家带来的浅谈js的异步执行全部内容了,希望大家多多支持三水点靠木~

Javascript 相关文章推荐
Ext第一周 史上最强学习笔记---GridPanel(基础篇)
Dec 29 Javascript
js 上传图片预览问题
Dec 06 Javascript
原生js实现跨浏览器获取鼠标按键的值
Apr 08 Javascript
FF IE浏览器修改标签透明度的方法
Jan 27 Javascript
javascript刷新父页面的各种方法汇总
Sep 03 Javascript
JavaScript基本语法讲解
Jun 03 Javascript
JavaScript中字符串(string)转json的2种方法
Jun 25 Javascript
vue-cli配置环境变量的方法
Jul 09 Javascript
在小程序中使用canvas的方法示例
Sep 17 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
Mar 21 Javascript
Vue实现购物车的全选、单选、显示商品价格代码实例
May 06 Javascript
vue3.0中友好使用antdv示例详解
Jan 05 Vue.js
Jquery AJAX POST与GET之间的区别详细介绍
Oct 17 #Javascript
微信小程序 教程之模块化
Oct 17 #Javascript
微信小程序 教程之注册页面
Oct 17 #Javascript
微信小程序 教程之注册程序
Oct 17 #Javascript
微信小程序 教程之小程序配置
Oct 17 #Javascript
jQuery事件对象总结
Oct 17 #Javascript
微信小程序 MINA文件结构
Oct 17 #Javascript
You might like
在php和MySql中计算时间差的方法详解
2015/03/27 PHP
Laravel重定向,a链接跳转,控制器跳转示例
2019/10/22 PHP
Cookie 注入是怎样产生的
2009/04/08 Javascript
JavaScript 学习笔记(十一)
2010/01/19 Javascript
一个简单的js渐显(fadeIn)渐隐(fadeOut)类
2010/06/19 Javascript
JS基于VML技术实现的五角星礼花效果代码
2015/10/26 Javascript
javascript基础语法学习笔记
2016/01/04 Javascript
10个JavaScript中易犯小错误
2016/02/14 Javascript
一步步教大家编写酷炫的导航栏js+css实现
2016/03/14 Javascript
jQuery easyUI datagrid 增加求和统计行的实现代码
2016/06/01 Javascript
详解JS中的attribute属性
2017/04/25 Javascript
angular动态删除ng-repaeat添加的dom节点的方法
2017/07/20 Javascript
分析javascript中9 个常见错误阻碍你进步
2017/09/18 Javascript
vue watch自动检测数据变化实时渲染的方法
2018/01/16 Javascript
除Console.log()外更多的Javascript调试命令
2018/01/24 Javascript
VUE-cli3使用 svg-sprite-loader
2018/10/20 Javascript
监控微信小程序中的慢HTTP请求过程详解
2019/07/05 Javascript
vue父子组件通信的高级用法示例
2019/08/29 Javascript
JS模拟实现京东快递单号查询
2020/11/30 Javascript
一起深入理解js中的事件对象
2021/02/06 Javascript
详解Python中__str__和__repr__方法的区别
2015/04/17 Python
django定期执行任务(实例讲解)
2017/11/03 Python
python执行精确的小数计算方法
2019/01/21 Python
Python使用MyQR制作专属动态彩色二维码功能
2019/06/04 Python
使用django实现一个代码发布系统
2019/07/18 Python
python生成大写32位uuid代码
2020/03/03 Python
django前端页面下拉选择框默认值设置方式
2020/08/09 Python
Deichmann英国:德国鞋类零售商
2021/01/30 全球购物
好的自荐信的要求
2013/10/30 职场文书
建筑结构施工专业推荐信
2014/02/21 职场文书
电视节目策划方案
2014/05/16 职场文书
2014年保卫部工作总结
2014/11/21 职场文书
求职自我评价范文
2015/03/09 职场文书
《秋天的图画》教学反思
2016/02/19 职场文书
2016年小学“感恩教师”主题队日活动总结
2016/04/01 职场文书
Centos系统通过Docker安装并搭建MongoDB数据库
2022/04/12 MongoDB