浅谈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 相关文章推荐
javaScript 关闭浏览器 (不弹出提示框)
Jan 31 Javascript
js解决弹窗问题实现班级跳转DIV示例
Jan 06 Javascript
动态载入js提高网页打开速度的方法
Jul 04 Javascript
javascript实现炫酷的拖动分页
May 11 Javascript
jQuery自定义数值抽奖活动代码
Jun 11 Javascript
JS实现二叉查找树的建立以及一些遍历方法实现
Apr 17 Javascript
JavaScript中undefined和null的区别
May 03 Javascript
微信小程序和H5页面间相互跳转代码实例
Sep 19 Javascript
浅析webpack-bundle-analyzer在vue-cli3中的使用
Oct 23 Javascript
微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示功能的实现
Jul 22 Javascript
深入理解Vue的数据响应式
May 15 Vue.js
vue项目支付功能代码详解
Feb 18 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
我的论坛源代码(二)
2006/10/09 PHP
PHP版国家代码、缩写查询函数代码
2011/08/14 PHP
PHP中ltrim()函数的用法与实例讲解
2019/03/28 PHP
httpclient模拟登陆具体实现(使用js设置cookie)
2013/12/11 Javascript
js函数在frame中的相互调用详解
2014/03/03 Javascript
window.location.href的用法(动态输出跳转)
2014/08/09 Javascript
JavaScript控制网页层收起和展开效果的方法
2015/04/15 Javascript
AngularJS表单和输入验证实例
2016/11/02 Javascript
Bootstrap基本组件学习笔记之导航(10)
2016/12/07 Javascript
老生常谈jacascript DOM节点获取
2017/04/17 Javascript
分享5个顶级的JavaScript Ajax组件库
2018/09/16 Javascript
vue实现压缩图片预览并上传功能(promise封装)
2019/01/10 Javascript
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
Python中集合的内建函数和内建方法学习教程
2015/08/19 Python
详解Python函数可变参数定义及其参数传递方式
2017/08/02 Python
python批量替换多文件字符串问题详解
2018/04/22 Python
详解Python发送email的三种方式
2018/10/18 Python
Python人脸识别第三方库face_recognition接口说明文档
2019/05/03 Python
python中下标和切片的使用方法解析
2019/08/27 Python
python 利用matplotlib在3D空间中绘制平面的案例
2021/02/06 Python
canvas 绘图时位置偏离的问题解决
2020/09/16 HTML / CSS
台湾最大银发乐活百货:乐龄网
2018/05/21 全球购物
美国在线打印网站:Overnight Prints
2018/10/11 全球购物
英国女性时尚鞋类的潮流制造者:Koi Footwear
2018/10/19 全球购物
什么是网络协议
2016/04/07 面试题
优秀教师获奖感言
2014/01/31 职场文书
优秀班主任事迹材料
2014/12/16 职场文书
2015年清明节网上祭英烈活动总结
2015/03/26 职场文书
家长意见和建议怎么写
2015/06/04 职场文书
单位同意报考证明
2015/06/17 职场文书
检讨书之工作不认真
2019/08/14 职场文书
python随机打印成绩排名表
2021/06/23 Python
vue-router中hash模式与history模式的区别
2021/06/23 Vue.js
Python中的turtle画箭头,矩形,五角星
2022/03/16 Python
《极主夫道》真人电影正式预告 定档6月3日上映
2022/04/05 日漫
MySQL聚簇索引和非聚簇索引的区别详情
2022/06/14 MySQL