请求多并发

有的时候同一个页面被可能同时产生多个ajax请求,为了用户体验,最好是发送并行请求,这就产生了并发问题,应该如何处理?

并行改串行

这种方法是最简单的了,就是在一个请求执行完后在执行另一个请求。代码如下:

1)在回调中执行下一请求

    functionasync1() {
      //do sth...
      async2();
    }
    
    functionasync2() {
      //do sth...
    }
    
    async1();

2)将 ajax 改为同步,按顺序执行

    var url1,url2;
    
    $.ajax({
      url: url1,
      async: false
    });
    
    $.ajax({
      url: url2,
      async: false
    });

很显然,这种方法会需要比较长的等待时间,用户体验不是很好。

使用计数器

就是使用一个标志位标记请求是否已经完成

1)循环非阻塞

这种方法会影响性能,尽量少用:

    var cnt =0;
    
    functionasync1() {
      //do sth...
      cnt++;
    }
    
    function async2() {
      //do sth...
      cnt++;
    }
    
    async1();
    async2();
    
    var interval = setInterval(function(){
      if (2 === cnt) {
        console.log(‘已执行完成‘);
        clearInterval(interval)
      }
    }, 0);

2) 回调计数

    var cnt = 0;

    function async1() {
      //do sth...
      callback();
    }
    
    function async2() {
      //do sth...
      callback();
    }
    
    function callback() {
      cnt++;
      if (2 == cnt)
        console.log(‘都已执行完毕‘);
    }
    
    async1();
    async2();

第三方框架实现

若使用第三方框架实现,则要看第三方的相关文档:

1)jquery

    var d1 =$.Deferred();
    var d2 =$.Deferred();

    functionasync1() {
      d1.resolve("Fish");
    }

    functionasync2() {
      d2.resolve("Pizza");
    }

    async1();
    async2();

    $.when(d1,d2).done(function(v1, v2) {
      console.log(v1 + v2 + ‘已完成‘);
    });

2)axios

    //下面是关于同时发起多个请求时的处理
    axios.all([get1(),get2()])
      .then(axios.spread(function(res1,res2) {
        // 只有两个请求都完成才会成功,否则会被catch捕获
      }));

还有很多框架都可以,比如Angular的$wacth等等

ES6来实现

使用ES6中的promise、asyn、await等应该都可以实现,由于本人尚未使用过,暂时不讲,到时候再补充。

时间: 2024-08-29 11:10:04

请求多并发的相关文章

springMVC一个Controller处理所有用户请求的并发问题

有状态和无状态的对象基本概念: 有状态对象(Stateful Bean),就是有实例变量的对象 ,可以保存数据,是非线程安全的.一般是prototype scope. 无状态对象(Stateless Bean),就是没有实例变量的对象,不能保存数据,是不变类,是线程安全的.一般是singleton scope. 如Struts2中的Action,假如内部有实例变量User,当调用新增用户方法时,user是用来保存数据,那么此action是有状态对象.多个线程同时访问此action时 会造成use

既然nodejs是单线程的,那么它怎么处理多请求高并发的?

单线程解决高并发的思路就是采用非阻塞,异步编程的思想.简单概括就是当遇到非常耗时的IO操作时,采用非阻塞的方式,继续执行后面的代码,并且进入事件循环,当IO操作完成时,程序会被通知IO操作已经完成.主要运用JavaScript的回调函数来实现. 多线程虽然也能解决高并发,但是是以建立多个线程来实现,其缺点是当遇到耗时的IO操作时,当前线程会被阻塞,并且把cpu的控制权交给其他线程,这样带来的问题就是要非常频繁的进行线程的上下文切换.

关于:清除并发请求和(或)管理器数据 请求的理解

请求说明:该请求能够清除平时提交的请求日志文件.并发管理器的日志文件.报表输出文件.并发请求和并发管理器进程的历史记录信息. 參数说明:(红色标注字段为必输项) 1.  实体:ALL:清除请求历史记录.并发管理器历史记录.请求日志文件.报表输出 文件. Manager:清除并发管理器历史记录.管理器日志文件. Request:清除并发请求历史记录.请求日志文件.报表输出文件. 2.  模式:使用期限:保存近期几天的历史记录. 计数:保存近期几条历史记录 3.  模式值:依据模式,输入天数或记录条

【转】关于“不同浏览器的并发异步请求”的简单研究

之前在开发过程中有发现在一个页面内同时对单个url发出多个Ajax请求最后完成回调的只有最后一个.具体是什么原因导致的呢?针对这个问题,本人做了进一步的测试. 对于单个页面内并发的异步请求分为以下几种情况: 并发多个相同url的请求 并发多个不同url的请求(参数不同,协议相同) 并发多个不同url的请求(参数和协议都不同) 测试方法: 客户端:同时发出N异步请求,并输出发出请求的时间:当服务器返回相应数据后将接受请求的时间输出,并输出之前所发送的请求的标识ID. 服务器:服务器接到请求后延时一

Oracle EBS 清除并发请求和(或)管理器数据 请求

请求说明:该请求可以清除平时提交的请求日志文件.并发管理器的日志文件.报表输出文件.并发请求和并发管理器进程的历史记录信息. 参数说明:(红色标注字段为必输项)1.  实体:ALL:清除请求历史记录.并发管理器历史记录.请求日志文件.报表输出文件.Manager:清除并发管理器历史记录.管理器日志文件.Request:清除并发请求历史记录.请求日志文件.报表输出文件.2.  模式:使用期限:保存最近几天的历史记录.计数:保存最近几条历史记录3.  模式值:根据模式,输入天数或记录条数.如:模式选

java处理高并发高负载类网站的优化方法

一:高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个SPOF.尤其是Web2.0的应用,数据库的响应是首先要解决的. 一般来说MySQL是最常用的,可能最初是一个mysql主机,当数据增加到100万以上,那么,MySQL的效能急剧下降.常用的优化措施是M-S(主-从)方式进行同步复制,将查询和操作和分别在不同的服务器上进行操作.我推荐的是M-M-Slaves方式,2个主Mysql,多个Slaves,需要注意的是,虽然有2个Master,但是同时只有1个是Activ

Android应用中网络请求库Volley的介绍

Volley 是一个HTTP的库,使用它能让Android应用网络传输的操作更加轻松,快捷.Volley的代码是托管在Android 源代码树下的一个工程,编译出来后是一个volley.jar文件.以下是Volley的特点 自动调度在代码中提交的网络请求(http) 多个网络请求的并发执行 对用户透明的磁盘或内存的缓存机制(本质是Http缓存机制) 能够支持网络请求的优先级 能在代码中,必要时轻松的取消网络请求(如activity销毁时),可以取消指定tag的网络请求,或按某种机制分类的网络请求

并发测试开端

前言: 并发模型你们会想到什么来操作呢,是不是很高大上这个词语 我们测试常见跟开发人员接口或者并发问题,对我们测试很苦脑有没有? 记得我刚进测试的时候也是小白一个,做功能一直点点点,然后开发人员说测试一下压力测试 然后大家就是用工具来进行测试,这样的方法是可能进行测试,如果开发人员就给了你一个链接,什么都没有给,你们会在心理说,这怎么能做并发呢,没有参数这是我们测试脑袋中第一时间说的话,但很多公司就是这样,就告诉你在那里自己做,我们就要写异步脚本,对性能工具少一点依赖,我们用的最多听得最多就是J

ZooKeeper源码分析:Quorum请求的整个流程(转)

Quorum请求是转发给Leader处理,并且需要得一个Follower Quorum确认的请求.这些请求包括: 1)znode的写操作(OpCode.create,OpCode.delete,OpCode.setData,OpCode.setACL) 2)Session的创建和关闭操作(OpCode.createSession和OpCode.closeSession) 3)OpCode.multi操作. 本文分析了Client, Follower和Leader协同完成Quorum请求的过程.另