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 相关文章推荐
Wordpress ThickBox 添加“查看原图”效果代码
Dec 11 Javascript
jquery parent和parents的区别分析
Oct 02 Javascript
javascript先序遍历DOM树的方法
Feb 27 Javascript
原生js和jquery分别实现横向导航菜单效果
May 13 Javascript
老司机带你解读jQuery插件开发流程
May 16 Javascript
IE8兼容Jquery.validate.js的问题
Dec 01 Javascript
Angular.js中处理页面闪烁的方法详解
Mar 09 Javascript
vuejs项目打包之后的首屏加载优化及打包之后出现的问题
Apr 01 Javascript
详解.vue文件解析的实现
Jun 11 Javascript
Vue文件配置全局变量的实例
Sep 06 Javascript
微信小程序事件 bindtap bindinput代码实例
Aug 26 Javascript
vue组件暴露和.js文件暴露接口操作
Aug 11 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中的foreach问题
2013/06/30 PHP
PHP生成条形码大揭秘
2015/09/24 PHP
老生常谈PHP面向对象之解释器模式
2017/05/17 PHP
PHPExcel 修改已存在Excel的方法
2018/05/03 PHP
ThinkPHP防止重复提交表单的方法实例分析
2018/05/10 PHP
php求斐波那契数的两种实现方式【递归与递推】
2019/09/09 PHP
php中yar框架实例用法讲解
2020/12/27 PHP
基于jQuery的自动完成插件
2011/02/03 Javascript
子页向父页传值示例
2013/11/27 Javascript
使用js判断控件是否获得焦点
2014/01/03 Javascript
JS获取单击按钮单元格所在行的信息
2014/06/17 Javascript
jQuery实现鼠标经过事件的延时处理效果
2020/08/20 Javascript
ES6新特性三: Generator(生成器)函数详解
2017/04/21 Javascript
js 获取html5的data属性实现方法
2017/07/28 Javascript
node.js用fs.rename强制重命名或移动文件夹的方法
2017/12/27 Javascript
解决LayUI表单获取不到data的问题
2018/08/20 Javascript
ES6使用export和import实现模块化的方法
2018/09/10 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
2020/05/28 Javascript
微信小程序实现无限滚动列表
2020/05/29 Javascript
js实现自动播放匀速轮播图
2020/02/06 Javascript
nginx部署多个vue项目的方法示例
2020/09/06 Javascript
详解python 拆包可迭代数据如tuple, list
2017/12/29 Python
python遍历小写英文字母的方法
2019/01/02 Python
Python中栈、队列与优先级队列的实现方法
2019/06/30 Python
简单了解python协程的相关知识
2019/08/31 Python
基于python的itchat库实现微信聊天机器人(推荐)
2019/10/29 Python
中国跨境在线时尚零售商:Bellelily
2018/04/06 全球购物
标记环网Toke Ring IEEE802.5
2014/05/26 面试题
银行实习生自我鉴定范文
2013/09/19 职场文书
经理任命书模板
2014/06/06 职场文书
男性健康日的活动方案
2014/08/18 职场文书
团队会宣传标语
2014/10/09 职场文书
党的群众路线查摆剖析材料
2014/10/10 职场文书
优秀党员先进材料
2014/12/18 职场文书
导游词之云南-元阳梯田
2019/10/08 职场文书
javascript之Object.assign()的痛点分析
2022/03/03 Javascript