浅谈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 相关文章推荐
学习jquery之一
Apr 27 Javascript
javascript的内存管理详解
Aug 07 Javascript
js获取select标签的值且兼容IE与firefox
Dec 30 Javascript
AngularJS学习笔记之TodoMVC的分析
Feb 22 Javascript
js表单验证实例讲解
Mar 31 Javascript
JS表格组件神器bootstrap table详解(强化版)
May 26 Javascript
判断数组的最佳方法(推荐)
Oct 11 Javascript
理解javascript async的用法
Aug 22 Javascript
详解Vue-cli webpack移动端自动化构建rem问题
Apr 07 Javascript
Vue路由的模块自动化与统一加载实现
Jun 05 Javascript
vue页面引入three.js实现3d动画场景操作
Aug 10 Javascript
记录一次websocket封装的过程
Nov 23 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
理解PHP5中static和const关键字的区别
2007/03/19 PHP
php+Mysqli利用事务处理转账问题实例
2015/02/11 PHP
php中smarty区域循环的方法
2015/06/11 PHP
使用PHP编写发红包程序
2015/07/22 PHP
Yii操作数据库实现动态获取表名的方法
2016/03/29 PHP
在Mac OS下搭建LNMP开发环境的步骤详解
2017/03/10 PHP
jquery中实现简单的tabs插件功能的代码
2011/03/02 Javascript
JavaScript高级程序设计 读书笔记之十一 内置对象Global
2012/03/07 Javascript
firefox下jQuery UI Autocomplete 1.8.*中文输入修正方法
2012/09/19 Javascript
基于nodejs+express(4.x+)实现文件上传功能
2015/11/23 NodeJs
jquery实现删除一个元素后面的所有元素功能
2015/12/21 Javascript
4种JavaScript实现简单tab选项卡切换的方法
2016/01/06 Javascript
javascript HTML5 canvas实现打砖块游戏
2020/06/18 Javascript
jquery 点击元素后,滚动条滚动至该元素位置的方法
2016/08/05 Javascript
JavaScript实现大图轮播效果
2017/01/11 Javascript
$.browser.msie 为空或不是对象问题的多种解决方法
2017/03/19 Javascript
打造通用的匀速运动框架(实例讲解)
2017/10/17 Javascript
Vue面试题及Vue知识点整理
2018/10/07 Javascript
vue+element+Java实现批量删除功能
2019/04/08 Javascript
js时间转换毫秒的实例代码
2019/08/21 Javascript
JS简易计算器实例讲解
2020/06/30 Javascript
详解vue修改elementUI的分页组件视图没更新问题
2020/11/13 Javascript
python 处理telnet返回的More,以及get想要的那个参数方法
2019/02/14 Python
Python 多个图同时在不同窗口显示的实现方法
2019/07/07 Python
python导包的几种方法(自定义包的生成以及导入详解)
2019/07/15 Python
PyTorch-GPU加速实例
2020/06/23 Python
利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)
2020/09/04 Python
详解如何通过H5(浏览器/WebView/其他)唤起本地app
2017/12/11 HTML / CSS
玉兰油美国官网:OLAY美国
2018/10/25 全球购物
Bluebella法国官网:英国性感内衣品牌
2019/05/03 全球购物
2014预备党员党课学习心得范文
2014/07/08 职场文书
学生未请假就回家检讨书
2014/09/22 职场文书
党的群众路线教育实践活动个人对照检查材料(校长)
2014/11/05 职场文书
公安机关起诉意见书
2015/05/20 职场文书
你会写报告?产品体验报告到底该怎么写?
2019/08/14 职场文书
MySQL表字段时间设置默认值
2021/05/13 MySQL