浅谈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 相关文章推荐
学习ExtJS border布局
Oct 08 Javascript
JQuery 图片延迟加载并等比缩放插件
Nov 09 Javascript
基于Jquery的仿Windows Aero弹出窗(漂亮的关闭按钮)
Sep 28 Javascript
关于setInterval、setTimeout在jQuery中的使用注意事项
Sep 28 Javascript
jQuery 关于伪类选择符的使用说明
Apr 24 Javascript
Javascript基础教程之数据类型 (字符串 String)
Jan 18 Javascript
常用的js验证和数据处理总结
Aug 02 Javascript
从零学习node.js之mysql数据库的操作(五)
Feb 24 Javascript
JavaScript标准对象_动力节点Java学院整理
Jun 27 Javascript
详谈JS中数组的迭代方法和归并方法
Aug 11 Javascript
ES6中Symbol、Set和Map用法详解
Aug 20 Javascript
详解JavaScript中的Object.is()与&quot;===&quot;运算符总结
Jun 17 Javascript
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防止刷新重复提交页面的示例代码
2015/11/11 PHP
PHP计算近1年的所有月份
2017/03/13 PHP
浅谈ThinkPHP中initialize和construct的区别
2017/04/01 PHP
PHP实现非阻塞模式的方法分析
2018/07/26 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
jQuery maxlength文本字数限制插件
2010/04/16 Javascript
javascript 数字格式化输出的实现代码
2013/12/10 Javascript
JS 在指定数组中随机取出N个不重复的数据
2014/06/10 Javascript
JS回调函数的应用简单实例
2014/09/17 Javascript
JavaScript Math.ceil 方法(对数值向上取整)
2015/01/09 Javascript
jQuery使用DataTable实现删除数据后重新加载功能
2017/02/27 Javascript
JS+CSS实现下拉刷新/上拉加载插件
2017/03/31 Javascript
Easyui和zTree两种方式分别实现树形下拉框
2017/08/04 Javascript
JavaScript数组去重算法实例小结
2018/05/07 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
2019/05/09 Javascript
vue.js实现只能输入数字的输入框
2019/10/19 Javascript
Vue 中获取当前时间并实时刷新的实现代码
2020/05/12 Javascript
vue 解决data中定义图片相对路径页面不显示的问题
2020/08/13 Javascript
vue使用过滤器格式化日期
2021/01/20 Vue.js
[02:36]DOTA2英雄基础教程 帕格纳
2014/01/20 DOTA
python抓取网页内容示例分享
2014/02/24 Python
详解Python中的type()方法的使用
2015/05/21 Python
Python中max函数用于二维列表的实例
2018/04/03 Python
Python (Win)readline和tab补全的安装方法
2019/08/27 Python
详解Django admin高级用法
2019/11/06 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
2020/03/24 Python
怀俄明州飞钓:Platte River Fly Shop
2017/12/28 全球购物
优质飞蝇钓和渔具:RiverBum
2020/05/10 全球购物
php优化查询foreach代码实例讲解
2021/03/24 PHP
优秀教师工作感言
2014/02/16 职场文书
少先队学雷锋活动总结范文
2014/03/09 职场文书
优秀护士演讲稿
2014/04/30 职场文书
银行纠风工作实施方案
2014/06/08 职场文书
餐厅服务员管理制度
2015/08/05 职场文书
Nginx虚拟主机的搭建的实现步骤
2022/01/18 Servers
英国数字版游戏销量周榜公布 《小缇娜的奇幻之地》登顶
2022/04/03 其他游戏