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阻止用户多次提交示例代码
Mar 26 Javascript
JSON格式的时间/Date(2367828670431)/格式转为正常的年-月-日 格式的代码
Jul 27 Javascript
jQuery图片轮播实现并封装(一)
Dec 03 Javascript
微信小程序 less文件编译成wxss文件实现办法
Dec 05 Javascript
ES6正则的扩展实例详解
Apr 25 Javascript
详解javascript appendChild()的完整功能
Aug 18 Javascript
vue里面v-bind和Props 利用props绑定动态数据的方法
Aug 27 Javascript
微信小程序实现原生步骤条
Jul 25 Javascript
Vue + Element UI图片上传控件使用详解
Aug 20 Javascript
ElementUI中el-tree节点的操作的实现
Feb 27 Javascript
如何配置vue.config.js 处理static文件夹下的静态文件
Jun 19 Javascript
Openlayers实现地图全屏显示
Sep 28 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 Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
2012/06/17 PHP
php中hashtable实现示例分享
2014/02/13 PHP
php计算程序运行时间的简单例子分享
2014/05/10 PHP
Yii的CDbCriteria查询条件用法实例
2014/12/04 PHP
Symfony数据校验方法实例分析
2015/01/26 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
2017/11/03 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
2020/02/21 PHP
PhpStorm2020 + phpstudyV8 +XDebug的教程详解
2020/09/17 PHP
PHP7 标准库修改
2021/03/09 PHP
nodejs 整合kindEditor实现图片上传
2015/02/03 NodeJs
深入探究使JavaScript动画流畅的一些方法
2015/06/30 Javascript
javascript实现连续赋值
2015/08/10 Javascript
JQuery.Ajax()的data参数类型实例详解
2015/11/20 Javascript
AJAX和jQuery动态加载数据的实现方法
2016/12/05 Javascript
微信小程序之仿微信漂流瓶实例
2016/12/09 Javascript
JS中使用gulp实现压缩文件及浏览器热加载功能
2017/07/12 Javascript
Vue.js递归组件构建树形菜单
2017/12/24 Javascript
jQuery扩展方法实现Form表单与Json互相转换的实例代码
2018/09/05 jQuery
electron + vue项目实现打印小票功能及实现代码
2018/11/25 Javascript
Node.js JSON模块用法实例分析
2019/01/04 Javascript
常见的浏览器存储方式(cookie、localStorage、sessionStorage)
2019/05/07 Javascript
Vue项目中配置pug解析支持
2019/05/10 Javascript
浅谈webpack构建工具配置和常用插件总结
2020/05/11 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
[01:42]DOTA2 – 虚无之灵
2019/08/25 DOTA
[42:32]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
Python通过PIL获取图片主要颜色并和颜色库进行对比的方法
2015/03/19 Python
python调用staf自动化框架的方法
2018/12/26 Python
使用Python+wxpy 找出微信里把你删除的好友实例
2019/02/21 Python
Python切片列表字符串如何实现切换
2020/08/06 Python
英国最大的美妆产品在线零售商之一:Beauty Bay
2017/09/29 全球购物
大学生毕业求职简历的自我评价
2013/10/24 职场文书
名人演讲稿范文
2013/12/28 职场文书
小学优秀教育工作者事迹材料
2014/05/09 职场文书
航班延误投诉信
2015/07/02 职场文书
Python爬虫入门案例之爬取二手房源数据
2021/10/16 Python