JS前端發起多個Ajax請求


頁面可能產生多個ajax請求(不定數量的),為了用戶體驗,最好是發送並行請求,這就產生了並發問題,應該如何處理?

串行處理

串行處理的缺點就是會比較慢;

         var Data=[];
         for(var i=0;i<urlArray.length;i++){
             //異步
            $.ajax({
                url:urlArray[i],
                type:"POST",
                async:false,
                data:requestBody,               
                success:function(ctData){Data.push(ctData)},
                datatype: 'json'})
         }
         //數據都回來,之后一起處理

回調處理

利用閉包把數據按照請求的順序放到對應的位置,然后請求數據全回來了一起處理:

             var DataAjax=[];
             var count=0;
             var succFunc=function(i){
               return  function(ctData){
                    debugger
                    count++;
                    DataAjax[i]=ctData
                    if (count==urlArray.length){
                        DataProcess(myChart,DataAjax,option,element);
                    }
                    return chartData
                }
             }
             for(var i=0;i<urlArray.length;i++){
                DataAjax[i]=[]         
               $.ajax({
                    url:urlArray[i],
                    type:"POST",                                 
                    data:requestBody,                   
                    success:succFunc(i),
                    fail:function(ctData){return []},
                    datatype: 'json'})
                }

循環等待(不推薦)

循環等待,這樣會比較消耗cpu;

    var cnt = 0;  
    function async1(){  
        //do sth...  
        cnt++;  
    }  
    function async2(){  
        //do sth...  
        cnt++;  
    }  
    while(2>cnt){}  

Jquery並發包

在ES5的實現方式如下,在提取返回值時,需要判斷arguments的數量:

         var DataAjax=[];                                 
         for(var i=0;i<urlArray.length;i++){                            
            var tempajax=$.ajax({
                url:urlArray[i],
                type:"POST",                                 
                data:requestBody,            
                success:function(json){
                    return json
                },
                fail:function(chartData){return []},
                datatype: 'json'})
               DataAjax.push(tempajax)
             }
               $.when.apply($,DataAjax).done(function(){                       
                    var ctData=[]
                    if(urlArray.length>1){
                        for(var i in arguments){                              
                            ctData[i]=arguments[i][0]
                        }
                    }else{
                        ctData.push(arguments[0])
                    }                                           
                    DataProcess(myChart,ctData,option,element);
               })

高版本支持Promise

用到再補充....

拓展延伸待思考

並發的時候,限制並發的數量。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM