浅谈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 相关文章推荐
不要小看注释掉的JS 引起的安全问题
Dec 27 Javascript
判断iframe是否加载完成的完美方法
Jan 07 Javascript
php+js实现倒计时功能
Jun 02 Javascript
使用CamanJS在Web页面上处理图像的技巧
Aug 18 Javascript
jquery判断复选框选中状态以及区分attr和prop
Dec 18 Javascript
在Node.js中使用Javascript Generators详解
May 05 Javascript
浅谈$('div a') 与$('div&gt;a')的区别
Jul 18 Javascript
Angular.js 4.x中表单Template-Driven Forms详解
Apr 25 Javascript
jQuery实现的模仿雨滴下落动画效果
Dec 11 jQuery
Vue.js组件高级特性实例详解
Dec 24 Javascript
node中IO以及定时器优先级详解
May 10 Javascript
微信小程序 轮播图实现原理及优化详解
Sep 29 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
雄兵连:第三季确定会出,不过时间未定,鹤熙是第三季的主角!
2020/03/13 国漫
PHP4和PHP5共存于一系统
2006/11/17 PHP
Windows2003 下 MySQL 数据库每天自动备份
2006/12/21 PHP
PHP连接access数据库
2015/03/27 PHP
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
PHP针对多用户实现更换头像功能
2016/09/04 PHP
PHP大文件切割上传功能实例分析
2019/07/01 PHP
索趣科技的答案
2007/02/07 Javascript
IE中radio 或checkbox的checked属性初始状态下不能选中显示问题
2009/07/25 Javascript
JQuery与Ajax常用代码实现对比
2009/10/03 Javascript
javascript的原生方法获取数组中的最大(最小)值
2012/12/19 Javascript
js异步加载的三种解决方案
2013/03/04 Javascript
常规表格多表头查询示例
2014/02/21 Javascript
Jquery操作js数组及对象示例代码
2014/05/11 Javascript
jQuery实现的在线答题功能
2015/04/12 Javascript
php结合imgareaselect实现图片裁剪
2015/07/05 Javascript
jquery实现全选和全不选功能效果的实现代码【推荐】
2016/05/05 Javascript
微信小程序 Video API实例详解
2016/10/02 Javascript
vue-vuex中使用commit提交mutation来修改state的方法详解
2018/09/16 Javascript
vue点击当前路由高亮小案例
2019/09/26 Javascript
JS实现星星海特效
2019/12/24 Javascript
Python2.x中文乱码问题解决方法
2015/06/02 Python
Python爬取网易云音乐热门评论
2017/03/31 Python
Python科学画图代码分享
2017/11/29 Python
Python3实现购物车功能
2018/04/18 Python
对Python2与Python3中__bool__方法的差异详解
2018/11/01 Python
Python(PyS60)实现简单语音整点报时
2019/11/18 Python
Python面向对象之私有属性和私有方法应用案例分析
2019/12/31 Python
python 解决flask 图片在线浏览或者直接下载的问题
2020/01/09 Python
Python实现病毒仿真器的方法示例(附demo)
2020/02/19 Python
python安装读取grib库总结(推荐)
2020/06/24 Python
英语四级考试作弊检讨书
2014/09/29 职场文书
离婚撤诉申请书范本
2015/05/18 职场文书
有关骆驼祥子的读书笔记
2015/06/26 职场文书
纯CSS如何禁止用户复制网页的内容
2021/11/01 HTML / CSS
GoFrame基于性能测试得知grpool使用场景
2022/06/21 Golang