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实现的兼容各浏览器的添加和移除事件封装
Mar 28 Javascript
JS实现选定指定HTML元素对象中指定文本内容功能示例
Feb 13 Javascript
react-native 封装选择弹出框示例(试用ios&android)
Jul 11 Javascript
js+html获取系统当前时间
Nov 10 Javascript
JS实现延迟隐藏功能的方法(类似QQ头像鼠标放上展示信息)
Dec 28 Javascript
vue源码解析之事件机制原理
Apr 21 Javascript
js中对象和面向对象与Json介绍
Jan 21 Javascript
VUE组件中的 Drawer 抽屉实现代码
Aug 06 Javascript
vue仿淘宝滑动验证码功能(样式模仿)
Dec 10 Javascript
原生JS实现无缝轮播图片
Jun 24 Javascript
vue实现一个矩形标记区域(rectangle marker)的方法
Oct 28 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
Nov 09 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
玛琪朵 Macchiato
2021/03/03 咖啡文化
用php+mysql一个名片库程序
2006/10/09 PHP
PHP JSON 数据解析代码
2010/05/26 PHP
微信公众平台接口开发入门示例
2014/12/24 PHP
javascript模版引擎-tmpl的bug修复与性能优化分析
2011/10/23 Javascript
实用的Jquery选项卡TAB示例代码
2013/08/28 Javascript
可自定义速度的js图片无缝滚动示例分享
2014/01/20 Javascript
js和jquery使按钮失效为不可用状态的方法
2014/01/26 Javascript
jquery选择器之属性过滤选择器详解
2014/01/27 Javascript
5个JavaScript经典面试题
2014/10/13 Javascript
javascript中sort()的用法实例分析
2015/01/30 Javascript
JS奇技之利用scroll来监听resize详解
2017/06/15 Javascript
js实现图片轮播效果学习笔记
2017/07/26 Javascript
详解win7 cmd执行vue不是内部命令的解决方法
2017/07/27 Javascript
关于ES6箭头函数中的this问题
2018/02/27 Javascript
使用vue-cli(vue脚手架)快速搭建项目的方法
2018/05/21 Javascript
JS使用iView的Dropdown实现一个右键菜单
2019/05/06 Javascript
layui 中select下拉change事件失效的解决方法
2019/09/20 Javascript
layer扩展打开/关闭动画的方法
2019/09/23 Javascript
vue如何搭建多页面多系统应用
2020/06/17 Javascript
一则python3的简单爬虫代码
2014/05/26 Python
Python实现的矩阵类实例
2017/08/22 Python
python 遍历目录(包括子目录)下所有文件的实例
2018/07/11 Python
Python实现根据日期获取当天凌晨时间戳的方法示例
2019/04/09 Python
Django模板标签{% for %}循环,获取制定条数据实例
2020/05/14 Python
Python xml、字典、json、类四种数据类型如何实现互相转换
2020/05/27 Python
Python中实现一行拆多行和多行并一行的示例代码
2020/09/06 Python
pycharm远程连接服务器并配置python interpreter的方法
2020/12/23 Python
英国领先的狗和宠物美容专家:Christies Direct
2017/04/03 全球购物
俄罗斯在线手表和珠宝商店:AllTime
2019/09/28 全球购物
搬家公司的创业计划书
2014/01/01 职场文书
致地震灾区的慰问信
2015/03/23 职场文书
秋菊打官司观后感
2015/06/03 职场文书
Django实现在线无水印抖音视频下载(附源码及地址)
2021/05/06 Python
vue 自定义的组件绑定点击事件
2022/04/21 Vue.js
Spring Boot 的创建和运行示例代码详解
2022/07/23 Java/Android