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 相关文章推荐
jQuery ajax cache缓存问题
Jul 01 Javascript
javaScript 页面自动加载事件详解
Feb 10 Javascript
js判断字符长度及中英文数字等
Mar 19 Javascript
jQuery多媒体插件jQuery Media Plugin使用详解
Dec 19 Javascript
node.js文件上传处理示例
Oct 27 Javascript
Bootstrap fileinput组件封装及使用详解
Mar 10 Javascript
利用JS做网页特效_大图轮播(实例讲解)
Aug 09 Javascript
JQuery 选择器、DOM节点操作练习实例
Sep 28 jQuery
JS实现利用两个队列表示一个栈的方法
Dec 13 Javascript
ES6 中可以提升幸福度的小功能
Aug 06 Javascript
Element UI 自定义正则表达式验证方法
Sep 04 Javascript
微信小程序点击滚动到指定位置的实现
May 22 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 读取和修改大文件的某行内容的代码
2009/10/30 PHP
支持中文字母数字、自定义字体php验证码代码
2012/02/27 PHP
PHP实现HTTP断点续传的方法
2015/06/17 PHP
PHP中set error handler函数用法小结
2015/11/11 PHP
PHP简单获取及判断提交来源的方法
2016/04/22 PHP
php传值方式和ajax的验证功能
2017/03/27 PHP
PHP正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
javascript form 验证函数 弹出对话框形式
2009/06/23 Javascript
jQuery UI AutoComplete 使用说明
2011/06/20 Javascript
裁剪字符串trim()自定义改进版
2013/04/10 Javascript
使用POST方式弹出窗口的两种方法示例介绍
2014/01/29 Javascript
浅析创建javascript对象的方法
2016/05/13 Javascript
详解基于Vue cli生成的Vue项目的webpack4升级
2018/06/19 Javascript
解决vue同一slot在组件中渲染多次的问题
2018/09/06 Javascript
微信公众平台 客服接口发消息的实现代码(Java接口开发)
2019/04/17 Javascript
微信小程序--获取用户地理位置名称(无须用户授权)的方法
2019/04/29 Javascript
为Python的Tornado框架配置使用Jinja2模板引擎的方法
2016/06/30 Python
Python实现PS图像调整黑白效果示例
2018/01/25 Python
Python 利用内置set函数对字符串和列表进行去重的方法
2018/06/29 Python
浅析python3中的os.path.dirname(__file__)的使用
2018/08/30 Python
python 提取key 为中文的json 串方法
2018/12/31 Python
Python基本类型的连接组合和互相转换方式(13种)
2019/12/16 Python
matplotlib绘制多子图共享鼠标光标的方法示例
2021/01/08 Python
澳洲网红粉泥面膜:Sand & Sky
2019/08/13 全球购物
Hotels.com拉丁美洲:从豪华酒店到经济型酒店的预定优惠和折扣
2019/12/09 全球购物
模具专业推荐信
2013/10/30 职场文书
客户经理岗位职责
2013/12/08 职场文书
六查六看自查材料
2014/02/17 职场文书
交通事故私了协议书
2014/04/16 职场文书
“向国旗敬礼”活动策划方案(4篇)
2014/09/27 职场文书
农村文化建设标语
2014/10/07 职场文书
2014年保育员工作总结
2014/12/02 职场文书
护士医德考评自我评价
2015/03/03 职场文书
离婚律师函范本
2015/05/27 职场文书
Python time库的时间时钟处理
2021/05/02 Python
教你使用RustDesk 搭建一个自己的远程桌面中继服务器
2022/08/14 Servers