JavaScript多并发问题如何处理


Posted in Javascript onOctober 28, 2015

经常在写代码的时候碰到这样的场景:页面初始化时显示loading页,同时启动多个ajax并发请求获取数据,当每个ajax请求返回时结束loading。

举个例子,一个下订单的页面,要查询常用地址信息、商品信息、地市信息…而这些请求都是异步的,希望等到所有数据加载完成后再允许用户操作。

要实现这个场景容易碰到的一个问题就是多并发怎么控制?下面是一些解决方法和思路:

并行改为串行

如果业务逻辑本身是串行的,但是提供的请求方式又是异步的,可以考虑此方法。
但本场景显然不是这种情况,这样做大大降低了页面性能,延长了加载速度。

回调

只适合并发数少的情况,多层嵌套回调会让代码的可读性大大降低

function async1(){
  //do sth...
}
function async2(){
  //do sth...
  async1();
}
async2();

ajax改为同步

如在jquery中将async参数设置为false

$.ajax({
  url:"/jquery/test1.txt",
  async:false
});

设置结束标识

简单一点的可以设置计数器,每完成一个异步函数加1,或者设置一个数组,每执行完一个异步函数更新数组。

回调计数

var cnt = 0;
function async1(){
  //do sth...
  callback();
}
function async2(){
  //do sth...
  callback();
}
function callback(){
  cnt++;
  if(2==cnt) console.log('都已执行完毕');
}

循环阻塞

var cnt = 0;
function async1(){
  //do sth...
  cnt++;
}
function async2(){
  //do sth...
  cnt++;
}
while(2>cnt){}

循环非阻塞

不建议过多使用,以免影响性能

var cnt = 0;
function async1(){
  //do sth...
  cnt++;
}
function async2(){
  //do sth...
  cnt++;
}
var interval = setInterval(function(){
  if(2===cnt){
    console.log('已执行完成');
    clearInterval(interval)
  }
}

第三方框架实现

jquery

目前我在项目中采用的方式

var d1 = $.Deferred();
var d2 = $.Deferred();
function async1(){
  d1.resolve( "Fish" );
}
function async2(){
  d2.resolve( "Pizza" );
}
$.when( d1, d2 ).done(function ( v1, v2 ) {
  console.log( v1 + v2 + '已完成');
});

以上内容是小编给大家介绍的关于JavaScript多并发问题如何处理的相关知识,希望对大家有所帮助。

Javascript 相关文章推荐
用jscript启动sqlserver
Jun 21 Javascript
解析JavaScript中的标签语句
Jun 19 Javascript
jquery实现的鼠标拖动排序Li或Table
May 04 Javascript
javascript实现网页中涉及的简易运动(改变宽高、透明度、位置)
Nov 29 Javascript
有关jquery与DOM节点操作方法和属性记录
Apr 15 Javascript
javascript 动态脚本添加的简单方法
Oct 11 Javascript
vue-resource调用promise取数据方式详解
Jul 21 Javascript
浅谈Vuex注入Vue生命周期的过程
May 20 Javascript
一文搞懂ES6中的Map和Set
May 20 Javascript
jqGrid表格底部汇总、合计行footerrow处理
Aug 21 Javascript
vue.js iview打包上线后字体图标不显示解决办法
Jan 20 Javascript
js实现九宫格抽奖
Mar 19 Javascript
JS实现双击屏幕滚动效果代码
Oct 28 #Javascript
基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式
Oct 28 #Javascript
jQuery实现滑动页面固定顶部显示(可根据显示位置消失与替换)
Oct 28 #Javascript
jquery实现的动态回到顶部特效代码
Oct 28 #Javascript
JavaScript如何调试有哪些建议和技巧附五款有用的调试工具
Oct 28 #Javascript
jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果
Oct 28 #Javascript
使用Chart.js图表库制作漂亮的响应式表单
Oct 28 #Javascript
You might like
浅谈PHP SHA1withRSA加密生成签名及验签
2019/03/18 PHP
laravel框架查询数据集转为数组的两种方法
2019/10/10 PHP
JavaScript获取GridView中用户点击控件的行号,列号
2009/04/14 Javascript
简单实用的js调试logger组件实现代码
2010/11/20 Javascript
IE6下focus与blur错乱的解决方案
2011/07/31 Javascript
仿中关村在线首页弹出式广告插件(jQuery版)
2012/05/03 Javascript
悬浮数字的实现案例
2014/02/19 Javascript
jQuery实现菜单式图片滑动切换
2015/03/14 Javascript
简介JavaScript中的getUTCFullYear()方法的使用
2015/06/10 Javascript
Javascript 是你的高阶函数(高级应用)
2015/06/15 Javascript
js简单实现表单中点击按钮动态增加输入框数量的方法
2015/08/18 Javascript
网页前端登录js按Enter回车键实现登陆的两种方法
2016/05/10 Javascript
js事件源window.event.srcElement兼容性写法(详解)
2016/11/25 Javascript
详解使用Vue.Js结合Jquery Ajax加载数据的两种方式
2017/01/10 Javascript
JavaScript hasOwnProperty() 函数实例详解
2017/08/04 Javascript
浅谈使用React.setState需要注意的三点
2017/12/18 Javascript
解决element-ui的下拉框有值却无法选中的情况
2020/11/07 Javascript
python print输出延时,让其立刻输出的方法
2019/01/07 Python
为什么从Python 3.6开始字典有序并效率更高
2019/07/15 Python
python对csv文件追加写入列的方法
2019/08/01 Python
python爬取Ajax动态加载网页过程解析
2019/09/05 Python
Django中自定义查询对象的具体使用
2019/10/13 Python
TensorFlow-gpu和opencv安装详细教程
2020/06/30 Python
Django如何使用asyncio协程和ThreadPoolExecutor多线程
2020/10/12 Python
Osklen官方在线商店:巴西服装品牌
2019/04/25 全球购物
Stührling手表官方网站:男女高品质时尚手表的领先零售商
2021/01/07 全球购物
物流管理专业大学生自荐信
2013/10/04 职场文书
数学专业毕业生自荐信
2013/11/10 职场文书
就业表自我评价分享
2014/02/06 职场文书
《识字五》教学反思
2014/03/01 职场文书
商务助理求职信范文
2014/04/20 职场文书
师德师风个人总结
2015/02/06 职场文书
2015年公民道德宣传日活动总结
2015/03/23 职场文书
社区挂职锻炼个人工作总结
2015/10/23 职场文书
JavaScript中关于预编译、作用域链和闭包的理解
2021/03/31 Javascript
Python Pandas读取Excel日期数据的异常处理方法
2022/02/28 Python