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插件
Nov 19 Javascript
js不能跳转到上一页面的问题解决方法
Mar 01 Javascript
js 字符串转换成数字的三种方法
Mar 23 Javascript
jQuery插件Tooltipster实现漂亮的工具提示
Apr 12 Javascript
jquery实现点击label的同时触发文本框点击事件的方法
Jun 05 Javascript
jQuery切换所有复选框选中状态的方法
Jul 02 Javascript
AngularJS 应用身份认证的技巧总结
Nov 07 Javascript
jquery实现点击页面回到顶部
Nov 23 Javascript
jQuery获取Table某列的值(推荐)
Mar 03 Javascript
详解基于vue-cli优化的webpack配置
Nov 06 Javascript
vue+element树组件 实现树懒加载的过程详解
Oct 21 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
Apr 26 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
Breeze 文章管理系统 v1.0.0正式发布
2006/12/14 PHP
一个简单php扩展介绍与开发教程
2010/08/19 PHP
php curl的深入解析
2013/06/02 PHP
PHP采用curl模仿用户登陆新浪微博发微博的方法
2014/11/07 PHP
PHP 实现代码复用的一个方法 traits新特性
2015/02/22 PHP
详解PHP的Yii框架中扩展的安装与使用
2016/04/01 PHP
php通过两层过滤获取留言内容的方法
2016/07/11 PHP
PHP实现的curl批量请求操作示例
2018/06/06 PHP
PHP命令Command模式用法实例分析
2018/08/08 PHP
Aster vs KG BO3 第一场2.18
2021/03/10 DOTA
基于jQuery选择器的整理集合
2013/04/26 Javascript
setInterval()和setTimeout()的用法和区别示例介绍
2013/11/17 Javascript
浅谈JavaScript的全局变量与局部变量
2016/06/10 Javascript
javascript cookie的基本操作(添加和删除)
2017/07/24 Javascript
限时抢购-倒计时的完整实例(分享)
2017/09/17 Javascript
详解vue-router 命名路由和命名视图
2018/06/01 Javascript
详解基于Vue cli生成的Vue项目的webpack4升级
2018/06/19 Javascript
JS限制输入框输入的实现代码
2018/07/02 Javascript
vue-resource:jsonp请求百度搜索的接口示例
2019/11/09 Javascript
微信小程序弹窗禁止页面滚动的实现代码
2020/12/30 Javascript
Python字符串格式化输出方法分析
2016/04/13 Python
Python 字符串大小写转换的简单实例
2017/01/21 Python
详解Python中类的定义与使用
2017/04/11 Python
Python基于matplotlib实现绘制三维图形功能示例
2018/01/18 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
2018/06/26 Python
Django ORM实现按天获取数据去重求和例子
2020/05/18 Python
详解python metaclass(元类)
2020/08/13 Python
python实现画图工具
2020/08/27 Python
体育教育毕业生自荐信
2013/11/21 职场文书
光信息科学与技术专业职业生涯规划
2014/03/13 职场文书
婚假请假条格式及范文
2014/04/10 职场文书
幼儿园教师演讲稿
2014/05/06 职场文书
茶楼服务员岗位职责
2015/02/09 职场文书
python字符串的多行输出的实例详解
2021/06/08 Python
PHP获取学生成绩的方法
2021/11/17 PHP
Vue Element plus使用方法梳理
2022/12/24 Vue.js