温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

请求多并发

发布时间:2020-08-14 02:06:30 来源:网络 阅读:3127 作者:xiedrsz 栏目:开发技术

    有的时候同一个页面被可能同时产生多个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();

   第三方框架实现

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

 1jquery
    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 + '已完成');
    });
 2axios
    //下面是关于同时发起多个请求时的处理
    axios.all([get1(),get2()])
      .then(axios.spread(function(res1,res2) {
        // 只有两个请求都完成才会成功,否则会被catch捕获
      }));

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

ES6来实现

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


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI