浅谈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给input和textarea设定ie中的focus
May 29 Javascript
jQuery学习笔记(1)--用jQuery实现异步通信(用json传值)具体思路
Apr 08 Javascript
js实现大转盘抽奖游戏实例
Jun 24 Javascript
Javascript连接Access数据库完整实例
Aug 03 Javascript
jQuery 移动端artEditor富文本编辑器
Jan 11 Javascript
JS实现简单的tab切换选项卡效果
Sep 21 Javascript
Node.js的文件权限及读写flag详解
Oct 11 Javascript
JScript实现地址选择功能
Aug 15 Javascript
使用Vue开发一个实时性时间转换指令
Jan 17 Javascript
Node.js 实现简单的无侵入式缓存框架的方法
Jul 21 Javascript
vue 动态组件用法示例小结
Mar 06 Javascript
vue缓存之keep-alive的理解和应用详解
Nov 02 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
为什么《星际争霸》是测试人工智能的理想战场
2019/12/03 星际争霸
php语言中使用json的技巧及json的实现代码详解
2015/10/27 PHP
Laravel5.7 数据库操作迁移的实现方法
2019/04/12 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
js页面滚动时层智能浮动定位实现(jQuery/MooTools)
2011/08/23 Javascript
mailto的使用技巧分享
2012/12/21 Javascript
Nodejs学习笔记之测试驱动
2015/04/16 NodeJs
javascript函数命名的三种方式及区别介绍
2016/03/22 Javascript
JS实现简单的二元方程计算器功能示例
2017/01/03 Javascript
ReactJS实现表单的单选多选和反选的示例
2017/10/13 Javascript
vue 挂载路由到头部导航的方法
2017/11/13 Javascript
vue通过指令(directives)实现点击空白处收起下拉框
2018/12/06 Javascript
JS实现动态倒计时功能(天数、时、分、秒)
2019/12/12 Javascript
浅谈vue权限管理实现及流程
2020/04/23 Javascript
Python封装shell命令实例分析
2015/05/05 Python
Python文件操作之合并文本文件内容示例代码
2017/09/19 Python
python导出chrome书签到markdown文件的实例代码
2017/12/27 Python
Python实现的随机森林算法与简单总结
2018/01/30 Python
python 读取DICOM头文件的实例
2018/05/07 Python
Python实现简单层次聚类算法以及可视化
2019/03/18 Python
python爬虫基础教程:requests库(二)代码实例
2019/04/09 Python
Python中低维数组填充高维数组的实现
2019/12/02 Python
Python中sorted()排序与字母大小写的问题
2020/01/14 Python
如何在Python 游戏中模拟引力
2020/03/27 Python
Python Opencv轮廓常用操作代码实例解析
2020/09/01 Python
中学教师管理制度
2014/01/14 职场文书
公司保密承诺书
2014/03/27 职场文书
数学教研活动总结
2014/07/02 职场文书
个人授权委托书格式
2014/08/30 职场文书
奥巴马上海演讲稿
2014/09/10 职场文书
圣诞节开幕词
2015/01/29 职场文书
市场部岗位职责
2015/02/12 职场文书
月考总结与反思
2015/10/22 职场文书
浅谈PHP7中的一些小技巧
2021/05/29 PHP
Win11怎样将锁屏账户头像图片改成动画视频
2021/11/21 数码科技
linux目录管理方法介绍
2022/06/01 Servers