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中的几个运算符
Jun 29 Javascript
鼠标经过的文本框textbox变色
May 21 Javascript
autoPlay 基于jquery的图片自动播放效果
Dec 07 Javascript
js中精确计算加法和减法示例
Mar 28 Javascript
Jquery对新插入的节点 绑定Click事件失效的解决方法
Jun 02 Javascript
jQuery soColorPacker 网页拾色器
Jun 22 Javascript
浅谈javascript中的三种弹窗
Oct 21 Javascript
js转换对象为xml
Feb 17 Javascript
JavaScript面向对象的程序设计(犯迷糊的小羊)
May 27 Javascript
脚手架vue-cli工程webpack的作用和特点
Sep 29 Javascript
angular 未登录状态拦截路由跳转的方法
Oct 09 Javascript
JS实现简易留言板特效
Dec 23 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
yii框架通过控制台命令创建定时任务示例
2014/04/30 PHP
ECMall支持SSL连接邮件服务器的配置方法详解
2014/05/19 PHP
PHP中isset与array_key_exists的区别实例分析
2015/06/02 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
下载文件个别浏览器文件名乱码解决办法
2013/03/19 Javascript
js charAt的使用示例
2014/02/18 Javascript
JavaScript控制按钮可用或不可用的方法
2015/04/03 Javascript
Bootstrap轮播加上css3动画,炫酷到底!
2015/12/22 Javascript
基于javascript实现泡泡大冒险网页版小游戏
2016/03/23 Javascript
vue监听input标签的value值方法
2018/08/27 Javascript
JavaScript实现栈结构Stack过程详解
2020/03/07 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 大神专访第二弹!
2014/05/20 DOTA
python支持断点续传的多线程下载示例
2014/01/16 Python
python中如何使用朴素贝叶斯算法
2017/04/06 Python
Python简单的制作图片验证码实例
2017/05/31 Python
Python+Turtle动态绘制一棵树实例分享
2018/01/16 Python
python 中的list和array的不同之处及转换问题
2018/03/13 Python
基于Python中求和函数sum的用法详解
2018/06/28 Python
在python中将字符串转为json对象并取值的方法
2018/12/31 Python
Python+pyplot绘制带文本标注的柱状图方法
2019/07/08 Python
html5 标签
2009/07/16 HTML / CSS
Clarisonic美国官网:科莱丽声波洁面仪
2017/10/12 全球购物
一套VC试题
2015/01/23 面试题
学习新党章思想汇报
2014/01/09 职场文书
股票投资建议书
2014/05/19 职场文书
个人政风行风自查自纠报告
2014/10/21 职场文书
模范班主任事迹材料
2014/12/17 职场文书
2015教师年度思想工作总结
2015/04/30 职场文书
年会主持人开场白台词
2015/05/29 职场文书
2015年“我们的节日·重阳节”活动总结
2015/07/29 职场文书
2016同学毕业寄语大全
2015/12/04 职场文书
新西兰:最新留学学习计划书写作指南
2019/07/15 职场文书
MySQL 聚合函数排序
2021/07/16 MySQL
Python实现批量将文件复制到新的目录中再修改名称
2022/04/12 Python
MySQL创建管理KEY分区
2022/04/13 MySQL
Go gorilla/sessions库安装使用
2022/08/14 Golang