浅谈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 相关文章推荐
一样的table?不一样的table(可编辑状态table)
Sep 19 Javascript
Js 获取Gridview选中行的内容操作步骤
Feb 05 Javascript
基于Jquery插件实现跨域异步上传文件功能
Apr 26 Javascript
功能强大的Bootstrap使用手册(一)
Aug 02 Javascript
JavaScript排序算法动画演示效果的实现方法
Oct 18 Javascript
WEB 前端开发中防治重复提交的实现方法
Oct 26 Javascript
js 实现一些跨浏览器的事件方法详解及实例
Oct 27 Javascript
Vue.js学习之计算属性
Jan 22 Javascript
微信小程序异步处理详解
Nov 10 Javascript
浅谈react-router HashRouter和BrowserRouter的使用
Dec 29 Javascript
小程序自定义日历效果
Dec 29 Javascript
通过GASP让vue实现动态效果实例代码详解
Nov 24 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生成HTML静态页面实例代码
2008/08/31 PHP
PHP中实现中文字符进制转换原理分析
2011/12/06 PHP
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
2013/06/14 PHP
PHP递归遍历指定目录的文件并统计文件数量的方法
2015/03/24 PHP
PHP递归的三种常用方式
2019/02/28 PHP
PHP pthreads v3下同步处理synchronized用法示例
2020/02/21 PHP
Sample script that displays all of the users in a given SQL Server DB
2007/06/16 Javascript
js 页面执行时间计算代码
2009/03/04 Javascript
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
javascript+xml实现简单图片轮换(只支持IE)
2012/12/23 Javascript
AngularJs学习第八篇 过滤器filter创建
2016/06/08 Javascript
详解JavaScript的内置对象
2016/12/07 Javascript
详解jQuery选择器
2016/12/21 Javascript
jquery uploadify如何取消已上传成功文件
2017/02/08 Javascript
node vue项目开发之前后端分离实战记录
2017/12/13 Javascript
使用Ajax和Jquery配合数据库实现下拉框的二级联动的示例
2018/01/25 jQuery
Vue动态生成el-checkbox点击无法赋值的解决方法
2019/02/21 Javascript
vue 项目 iOS WKWebView 加载
2019/04/17 Javascript
vue中改变滚动条样式的方法
2020/03/03 Javascript
vue中组件通信详解(父子组件, 爷孙组件, 兄弟组件)
2020/07/27 Javascript
[10:21]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster 选手采访
2021/03/11 DOTA
python中模块的__all__属性详解
2017/10/26 Python
使用Python的Django和layim实现即时通讯的方法
2018/05/25 Python
使用OpenCV-python3实现滑动条更新图像的Canny边缘检测功能
2019/12/12 Python
Python使用enumerate获取迭代元素下标
2020/02/03 Python
很酷的HTML5电子书翻页动画特效
2016/02/25 HTML / CSS
印度民族服装购物网站:BIBA
2019/08/05 全球购物
iHerb俄罗斯:维生素、补品和天然产品
2020/07/09 全球购物
公积金单位接收函
2014/01/11 职场文书
会计大学生职业生涯规划书范文
2014/01/13 职场文书
高中班级口号
2014/06/09 职场文书
校园环保广播稿(3篇)
2014/09/15 职场文书
反邪教教育心得体会
2016/01/15 职场文书
班组长如何制订适合本班组的工作计划?
2019/07/10 职场文书
Python OpenCV实现传统图片格式与base64转换
2021/06/13 Python
SQL基础的查询语句
2021/11/11 MySQL