JavaScript多并發(fā)問題如何處理
經(jīng)常在寫代碼的時候碰到這樣的場景:頁面初始化時顯示loading頁,同時啟動多個ajax并發(fā)請求獲取數(shù)據(jù),當每個ajax請求返回時結(jié)束loading。
舉個例子,一個下訂單的頁面,要查詢常用地址信息、商品信息、地市信息…而這些請求都是異步的,希望等到所有數(shù)據(jù)加載完成后再允許用戶操作。
要實現(xiàn)這個場景容易碰到的一個問題就是多并發(fā)怎么控制?下面是一些解決方法和思路:
并行改為串行
如果業(yè)務(wù)邏輯本身是串行的,但是提供的請求方式又是異步的,可以考慮此方法。
但本場景顯然不是這種情況,這樣做大大降低了頁面性能,延長了加載速度。
回調(diào)
只適合并發(fā)數(shù)少的情況,多層嵌套回調(diào)會讓代碼的可讀性大大降低
function async1(){
//do sth...
}
function async2(){
//do sth...
async1();
}
async2();
ajax改為同步
如在jquery中將async參數(shù)設(shè)置為false
$.ajax({
url:"/jquery/test1.txt",
async:false
});
設(shè)置結(jié)束標識
簡單一點的可以設(shè)置計數(shù)器,每完成一個異步函數(shù)加1,或者設(shè)置一個數(shù)組,每執(zhí)行完一個異步函數(shù)更新數(shù)組。
回調(diào)計數(shù)
var cnt = 0;
function async1(){
//do sth...
callback();
}
function async2(){
//do sth...
callback();
}
function callback(){
cnt++;
if(2==cnt) console.log('都已執(zhí)行完畢');
}
循環(huán)阻塞
var cnt = 0;
function async1(){
//do sth...
cnt++;
}
function async2(){
//do sth...
cnt++;
}
while(2>cnt){}
循環(huán)非阻塞
不建議過多使用,以免影響性能
var cnt = 0;
function async1(){
//do sth...
cnt++;
}
function async2(){
//do sth...
cnt++;
}
var interval = setInterval(function(){
if(2===cnt){
console.log('已執(zhí)行完成');
clearInterval(interval)
}
}
第三方框架實現(xiàn)
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 + '已完成');
});
以上內(nèi)容是小編給大家介紹的關(guān)于JavaScript多并發(fā)問題如何處理的相關(guān)知識,希望對大家有所幫助。
相關(guān)文章
Javascript絕句欣賞 一些經(jīng)典的js代碼
Javascript絕句欣賞 一些經(jīng)典的js代碼整理,學(xué)習(xí)js的朋友可以參考下2012-02-02
通過button將form表單的數(shù)據(jù)提交到action層的實例
下面小編就為大家?guī)硪黄ㄟ^button將form表單的數(shù)據(jù)提交到action層的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09
WordPress 單頁面上一頁下一頁的實現(xiàn)方法【附代碼】
下面小編就為大家?guī)硪黄猈ordPress 單頁面上一頁下一頁的實現(xiàn)方法【附代碼】。小編覺得非常不錯。給大家分享一下。希望能給大家一個參考。2016-03-03

