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 相关文章推荐
显示js对象所有属性和方法的函数
Oct 16 Javascript
javascript 四则运算精度修正函数代码
May 31 Javascript
javascript学习笔记(九)javascript中的原型(prototype)及原型链的继承方式
Apr 12 Javascript
JS中setInterval、setTimeout不能传递带参数的函数的解决方案
Apr 28 Javascript
jQuery选择器源码解读(二):select方法
Mar 31 Javascript
jQuery+css实现的切换图片功能代码
Jan 27 Javascript
深入理解jquery中的事件与动画
May 24 Javascript
AngularJs Injecting Services Into Controllers详解
Sep 02 Javascript
vue使用axios时关于this的指向问题详解
Dec 22 Javascript
js闭包学习心得总结
Apr 17 Javascript
微信小程序+腾讯地图开发实现路径规划绘制
May 22 Javascript
js使用文档就绪函数动态改变页面内容示例【innerHTML、innerText】
Nov 07 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
SONY ICF-SW07收音机电路分析
2021/03/02 无线电
WINDOWS 2000下使用ISAPI方式安装PHP
2006/09/05 PHP
php实现比较两个文件夹异同的方法
2015/06/18 PHP
Yii2 加载css、js 载静态资源的方法
2017/03/10 PHP
xmlHTTP实例
2006/10/24 Javascript
js 分页全选或反选标识实现代码
2011/08/09 Javascript
JavaScript高级程序设计 读书笔记之八 Function类及闭包
2012/02/27 Javascript
原生JS操作网页给p元素添加onclick事件及表格隔行变色
2013/12/01 Javascript
javascript实现3D变换的立体圆圈实例
2015/08/06 Javascript
jQuery实现点击按钮弹出可关闭层的浮动层插件
2015/09/19 Javascript
JS 面向对象之继承---多种组合继承详解
2016/07/10 Javascript
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
浅谈Angular路由复用策略
2017/10/04 Javascript
解决vue 界面在苹果手机上滑动点击事件等卡顿问题
2018/11/27 Javascript
在VUE style中使用data中的变量的方法
2020/06/19 Javascript
原生js实现贪吃蛇游戏
2020/10/26 Javascript
了不起的11个JavaScript代码重构最佳实践小结
2021/01/11 Javascript
[39:02]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs VGJ.T
2018/04/01 DOTA
Python中的ConfigParser模块使用详解
2015/05/04 Python
python开发之文件操作用法实例
2015/11/13 Python
Python每天必学之bytes字节
2016/01/28 Python
Python极简代码实现杨辉三角示例代码
2016/11/15 Python
django的ORM操作 删除和编辑实现详解
2019/07/24 Python
Django接收post前端返回的json格式数据代码实现
2019/07/31 Python
详解Python中import机制
2020/09/11 Python
Python3读写ini配置文件的示例
2020/11/06 Python
Python使用windows设置定时执行脚本
2020/11/12 Python
Python实现网络聊天室的示例代码(支持多人聊天与私聊)
2021/01/27 Python
CSS3制作酷炫的三维相册效果
2016/07/01 HTML / CSS
法国时尚品牌乐都特瑞士站:La Redoute瑞士
2016/09/05 全球购物
时尚、社区、科技:SEVENSTORE
2019/04/26 全球购物
linux面试题参考答案(11)
2012/05/01 面试题
汽车运用工程专业毕业生推荐信
2013/12/25 职场文书
创业计划书之寿司
2019/07/19 职场文书
90行Python代码开发个人云盘应用
2021/04/20 Python
Python 中 Shutil 模块详情
2021/11/11 Python