国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

JavaScript多并發問題如何處理

2019-11-20 11:23:32
字體:
來源:轉載
供稿:網友

經常在寫代碼的時候碰到這樣的場景:頁面初始化時顯示loading頁,同時啟動多個ajax并發請求獲取數據,當每個ajax請求返回時結束loading。

舉個例子,一個下訂單的頁面,要查詢常用地址信息、商品信息、地市信息…而這些請求都是異步的,希望等到所有數據加載完成后再允許用戶操作。

要實現這個場景容易碰到的一個問題就是多并發怎么控制?下面是一些解決方法和思路:

并行改為串行

如果業務邏輯本身是串行的,但是提供的請求方式又是異步的,可以考慮此方法。
但本場景顯然不是這種情況,這樣做大大降低了頁面性能,延長了加載速度。

回調

只適合并發數少的情況,多層嵌套回調會讓代碼的可讀性大大降低

function async1(){  //do sth...}function async2(){  //do sth...  async1();}async2();

ajax改為同步

如在jquery中將async參數設置為false

$.ajax({  url:"/jquery/test1.txt",  async:false});

設置結束標識

簡單一點的可以設置計數器,每完成一個異步函數加1,或者設置一個數組,每執行完一個異步函數更新數組。

回調計數

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

循環阻塞

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

循環非阻塞

不建議過多使用,以免影響性能

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

第三方框架實現

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 + '已完成');});

以上內容是小編給大家介紹的關于JavaScript多并發問題如何處理的相關知識,希望對大家有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 罗田县| 紫阳县| 上饶市| 崇明县| 根河市| 黑龙江省| 天峻县| 白城市| 澄江县| 镶黄旗| 肥乡县| 昆明市| 社旗县| 阳曲县| 沿河| 绥中县| 临漳县| 涪陵区| 交口县| 桃江县| 河曲县| 灵丘县| 丹东市| 竹山县| 苏尼特左旗| 赣榆县| 双鸭山市| 镇远县| 麻城市| 沙坪坝区| 皮山县| 湘乡市| 九龙县| 嘉峪关市| 化州市| 图们市| 寻甸| 永德县| 镇江市| 文昌市| 山丹县|