溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

請(qǐng)求多并發(fā)

發(fā)布時(shí)間:2020-08-14 02:06:30 來(lái)源:網(wǎng)絡(luò) 閱讀:3125 作者:xiedrsz 欄目:開(kāi)發(fā)技術(shù)

    有的時(shí)候同一個(gè)頁(yè)面被可能同時(shí)產(chǎn)生多個(gè)ajax請(qǐng)求,為了用戶體驗(yàn),最好是發(fā)送并行請(qǐng)求,這就產(chǎn)生了并發(fā)問(wèn)題,應(yīng)該如何處理?

   并行改串行

這種方法是最簡(jiǎn)單的了,就是在一個(gè)請(qǐng)求執(zhí)行完后在執(zhí)行另一個(gè)請(qǐng)求。代碼如下:

 1)在回調(diào)中執(zhí)行下一請(qǐng)求
    functionasync1() {
      //do sth...
      async2();
    }
    
    functionasync2() {
      //do sth...
    }
    
    async1();
 2)將 ajax 改為同步,按順序執(zhí)行
    var url1,url2;
    
    $.ajax({
      url: url1,
      async: false
    });
    
    $.ajax({
      url: url2,
      async: false
    });

很顯然,這種方法會(huì)需要比較長(zhǎng)的等待時(shí)間,用戶體驗(yàn)不是很好。

   使用計(jì)數(shù)器

就是使用一個(gè)標(biāo)志位標(biāo)記請(qǐng)求是否已經(jīng)完成

 1)循環(huán)非阻塞

這種方法會(huì)影響性能,盡量少用:

    var cnt =0;
    
    functionasync1() {
      //do sth...
      cnt++;
    }
    
    function async2() {
      //do sth...
      cnt++;
    }
    
    async1();
    async2();
    
    var interval = setInterval(function(){
      if (2 === cnt) {
        console.log('已執(zhí)行完成');
        clearInterval(interval)
      }
    }, 0);
 2) 回調(diào)計(jì)數(shù)
    var cnt = 0;

    function async1() {
      //do sth...
      callback();
    }
    
    function async2() {
      //do sth...
      callback();
    }
    
    function callback() {
      cnt++;
      if (2 == cnt)
        console.log('都已執(zhí)行完畢');
    }
    
    async1();
    async2();

   第三方框架實(shí)現(xiàn)

若使用第三方框架實(shí)現(xiàn),則要看第三方的相關(guān)文檔:

 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
    //下面是關(guān)于同時(shí)發(fā)起多個(gè)請(qǐng)求時(shí)的處理
    axios.all([get1(),get2()])
      .then(axios.spread(function(res1,res2) {
        // 只有兩個(gè)請(qǐng)求都完成才會(huì)成功,否則會(huì)被catch捕獲
      }));

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

ES6來(lái)實(shí)現(xiàn)

使用ES6中的promise、asynawait等應(yīng)該都可以實(shí)現(xiàn),由于本人尚未使用過(guò),暫時(shí)不講,到時(shí)候再補(bǔ)充。


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI