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 相关文章推荐
javascript基础的动画教程,直观易懂
Jan 10 Javascript
通过正则格式化url查询字符串实现代码
Dec 28 Javascript
jQuery在html有效在jsp无效的原因及解决方法
Aug 02 Javascript
JS实现自定义简单网页软键盘效果代码
Nov 05 Javascript
javascript实现的网站访问量统计代码
Dec 20 Javascript
JavaScript中循环遍历Array与Map的方法小结
Mar 12 Javascript
JS实现太极旋转思路分析
Dec 09 Javascript
JavaScript中捕获与冒泡详解及实例
Feb 03 Javascript
AjaxUpLoad.js实现文件上传功能
Mar 02 Javascript
vue.js中ref及$refs的使用方法解析
Oct 08 Javascript
Node使用Selenium进行前端自动化操作的代码实现
Oct 10 Javascript
Vue打包后访问静态资源路径问题
Nov 08 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
【星际争霸1】人族1v7家ZBath
2020/03/04 星际争霸
PHP函数eval()介绍和使用示例
2014/08/20 PHP
php有道翻译api调用方法实例
2014/12/22 PHP
JavaScript 事件系统
2010/07/22 Javascript
js,jQuery 排序的实现代码,网页标签排序的实现,标签排序
2011/04/27 Javascript
Javascript浅谈之this
2013/12/17 Javascript
第八篇Bootstrap下拉菜单实例代码
2016/06/21 Javascript
自动化测试读写64位操作系统的注册表
2016/08/15 Javascript
js模拟微博发布消息
2017/02/23 Javascript
vue2.0的contextmenu右键弹出菜单的实例代码
2017/07/24 Javascript
小程序图片剪裁加旋转的示例代码
2018/07/10 Javascript
微信小程序实现滴滴导航tab切换效果
2018/07/24 Javascript
vue init webpack 建vue项目报错的解决方法
2018/09/29 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
2019/05/09 Javascript
layui 根据后台数据动态创建下拉框并同时默认选中的实例
2019/09/02 Javascript
vue组件暴露和.js文件暴露接口操作
2020/08/11 Javascript
python自动化测试之setUp与tearDown实例
2014/09/28 Python
Python中shutil模块的学习笔记教程
2017/04/04 Python
python 读文件,然后转化为矩阵的实例
2018/04/23 Python
python交互界面的退出方法
2019/02/16 Python
解决python中使用PYQT时中文乱码问题
2019/06/17 Python
python的scipy实现插值的示例代码
2019/11/12 Python
基于Python实现粒子滤波效果
2020/12/01 Python
STRATHBERRY苏贝瑞包包官网:西班牙高级工匠手工打造
2020/11/10 全球购物
中东奢侈品购物网站:Ounass
2020/09/02 全球购物
大学生职业规划前言模板
2013/12/27 职场文书
学校党的群众路线教育实践活动整改措施
2014/10/25 职场文书
医院党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
办公室岗位职责
2015/02/04 职场文书
材料员岗位职责
2015/02/10 职场文书
毕业班工作总结
2015/08/10 职场文书
教师节感想
2015/08/11 职场文书
清洁工工作总结
2015/08/11 职场文书
2016年寒假生活小结
2015/10/10 职场文书
2019大学生社会实践报告汇总
2019/08/16 职场文书
python三子棋游戏
2022/05/04 Python