亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Jquery ajax 同步阻塞引起的UI線程阻塞問題

2019-11-20 11:15:06
字體:
來源:轉載
供稿:網友

最近做一個項目,遇到了一個問題同步ajax引起的ui線程阻塞問題,下面把我的問題解決過程分享給大家。

事情起因是這樣的,因為頁面上有多個相似的異步請求動作,本著提高代碼可重用性的原則,我封裝了一個名為getData的函數,它接收不同參數,只負責獲取數據,然后把數據return?;镜倪壿媱冸x出來是這樣的:

function getData1(){    var result;    $.ajax({      url : "p.php",      async : false,      success: function(data){        result = data;      }    });  return result;} 

這里的ajax不能用異步的,否則函數返回時,result還未賦值,會出錯。所以我加了async:false??雌饋砗孟駴]什么問題。我調用這個函數可以正常的得到數據。

$(".btn1").click(function(){    var data = getData1();    alert(data);});

接下來,要加另外一個功能,由于ajax請求有一定的耗時,所以我需要在發出請求前頁面有個loading效果,即顯示一張“正在加載”的gif圖片,想必大家也都見過。所以我的處理函數就變成了這樣:

$(".btn1").click(function(){    $(".loadingicon").show();    var data = getData1();    $(".loadingicon").hide();    alert(data);});

請求之前顯示loading圖片,請求完成后把它隱藏。看起來也沒什么問題。為了看清效果,我的p.php代碼sleep了3秒,如下:

<?phpsleep(3);echo ("aaaaaa");?>

但是我運行的時候問題出現了,我點擊按鈕并未像預想的那樣出現這個loading圖片,頁面什么反應也沒有。排除良久找到了原因,就在async:false這里。

瀏覽器的渲染(UI)線程和js線程是互斥的,在執行js耗時操作時,頁面渲染會被阻塞掉。當我們執行異步ajax的時候沒有問題,但當設置為同步請求時,其他的動作(ajax函數后面的代碼,還有渲染線程)都會停止下來。即使我的DOM操作語句是在發起請求的前一句,這個同步請求也會“迅速”將UI線程阻塞,不給它執行的時間。這就是代碼失效的原因。

setTimeout解決阻塞問題

  既然明白了問題在哪里,我們就來針對性想辦法。為了不讓同步ajax請求阻塞線程,我想到了setTimeout,把請求的代碼放到sestTimeout中,讓瀏覽器重啟一個線程來操作,不就解決問題了嗎?于是乎,我的代碼就變成了這樣:

$(".btn2").click(function(){    $(".loadingicon").show();    setTimeout(function(){      $.ajax({        url : "p.php",        async : false,        success: function(data){          $(".loadingicon").hide();          alert(data);        }      });    }, 0);}); 

setTimeout的第二個參數設為0,瀏覽器會在一個已設的最小時間后執行。不管三七二十一先運行起來看看。

  結果loading圖片顯示出來了,但是!?。D片怎么不動呢,我明明是一張動態gif圖。這個時候我很快就想到了,雖然同步請求延遲執行了,但是它執行期間還是會把UI線程給阻塞。這個阻塞相當牛逼,連gif圖片都不動了,看起來像一張靜態圖片一樣。

  結論很明顯,setTimeout治標不治本,相當于把同步請求“稍稍”異步了一下,接下來還是會進入同步的噩夢,阻塞線程。方案失敗。

是時候用Deferred了

  jQuery在1.5版本之后,引入了Deferred對象,提供的很方便的廣義異步機制。詳情可參看阮一峰老師的這篇文章http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html

  于是我用Deferred對象改寫了代碼,如下:

function getData3(){    var defer = $.Deferred();    $.ajax({      url : "p.php",      //async : false,      success: function(data){        defer.resolve(data)      }    });    return defer.promise();}  $(".btn3").click(function(){    $(".loadingicon").show();    $.when(getData3()).done(function(data){      $(".loadingicon").hide();      alert(data);    });});

可以看到我在ajax請求中去掉了async:false,也就是說,這個請求又是異步的了。另外請注意success函數中的這一 句:defer.resolve(data),Deferred對象的resolve方法可傳入一個參數,任意類型。這個參數可以在done方法中拿到, 所以我們異步請求來的數據就可以以這樣的方式來返回了。

  至此,問題得到了解決。Deferred對象如此強大且方便,我們可以好好利用它。

  我的全部測試代碼如下,有意的同學可以拿去測一下:

<button class="btn1">async:false</button><button class="btn2">setTimeout</button><button class="btn3">deferred</button><img class="loadingicon" style="position:fixed;left:50%;top:50%;margin-left:-16px;margin-top:-16px;display:none;" src=http://www.update8.com/Web/Jquery/"loading2.gif" alt="正在加載" /><script>  function getData1(){    var result;    $.ajax({      url : "p.php",      async : false,      success: function(data){        result = data;      }    });    return result;  }  $(".btn1").click(function(){    $(".loadingicon").show();    var data = getData1();    $(".loadingicon").hide();    alert(data);  });  $(".btn2").click(function(){    $(".loadingicon").show();    setTimeout(function(){      $.ajax({        url : "p.php",        async : false,        success: function(data){          $(".loadingicon").hide();          alert(data);        }      });    }, 0);  });  function getData3(){    var defer = $.Deferred();    $.ajax({      url : "p.php",      //async : false,      success: function(data){        defer.resolve(data)      }    });    return defer.promise();  }    $(".btn3").click(function(){    $(".loadingicon").show();    $.when(getData3()).done(function(data){      $(".loadingicon").hide();      alert(data);    });  });</script>

ps:$.ajax的參數描述

參數 描述

url 必需。規定把請求發送到哪個 URL。
data 可選。映射或字符串值。規定連同請求發送到服務器的數據。
success(data, textStatus, jqXHR) 可選。請求成功時執行的回調函數。
dataType 
可選。規定預期的服務器響應的數據類型。
默認執行智能判斷(xml、json、script 或 html)。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
草民午夜欧美限制a级福利片| 亚洲免费成人av电影| 国产精品福利在线观看| 国产视频在线一区二区| 国产精品视频大全| 91精品视频在线免费观看| 国产精品 欧美在线| 国产精品美女主播在线观看纯欲| xxxx欧美18另类的高清| 日韩中文字幕在线视频播放| 国产在线不卡精品| 91九色视频导航| 亚洲va男人天堂| 成人欧美一区二区三区在线湿哒哒| 国产91精品久久久久| 久久久噜久噜久久综合| 亚洲第一精品电影| 国产一区二区三区免费视频| 日韩欧美亚洲一二三区| 不卡毛片在线看| 亚洲天堂第二页| 麻豆乱码国产一区二区三区| 国产一区二区丝袜| 日本韩国欧美精品大片卡二| 97人人做人人爱| 国产精品日韩在线| 国产综合久久久久久| 国产精品视频播放| 日韩视频在线免费观看| 欧美日韩国产一区在线| 国产成人福利视频| 懂色av影视一区二区三区| 伊人久久久久久久久久久久久| 九九久久国产精品| 韩国福利视频一区| 久久99视频精品| 久久久av免费| 韩剧1988免费观看全集| 国产日韩欧美一二三区| 国产精品久久久久久久久影视| 中文字幕日韩在线观看| 欧美黑人又粗大| 17婷婷久久www| 日本成人精品在线| 国产精品美女久久久久av超清| 国产一区二区精品丝袜| 欧美视频裸体精品| 国产精品亚洲激情| 欧美裸身视频免费观看| 亚洲精品一区二区在线| 欧美激情乱人伦一区| 97在线精品国自产拍中文| 亚洲成年网站在线观看| 亚洲bt天天射| 久久久久久久香蕉网| 7m第一福利500精品视频| 91精品视频免费| 欧美激情一区二区三区久久久| 中文字幕在线日韩| 国产精品视频自拍| 国产精品久久久久久久久免费| 狠狠躁18三区二区一区| 韩国精品美女www爽爽爽视频| 粉嫩老牛aⅴ一区二区三区| 日韩美女在线播放| 日韩人体视频一二区| 精品国产一区二区三区久久久狼| 国产va免费精品高清在线观看| 热久久这里只有| 91久久久精品| www日韩欧美| 精品露脸国产偷人在视频| 精品露脸国产偷人在视频| 亚洲美女动态图120秒| 亚洲欧美激情一区| 丝袜亚洲欧美日韩综合| 久久影院在线观看| 国产一区二区三区在线| 亚洲aⅴ日韩av电影在线观看| xvideos亚洲| 日韩精品极品在线观看| 精品久久中文字幕久久av| 亚洲视频电影图片偷拍一区| 国外日韩电影在线观看| 奇门遁甲1982国语版免费观看高清| 亚洲国产中文字幕久久网| 午夜精品美女自拍福到在线| 精品国产电影一区| 欧美一区第一页| 欧美精品精品精品精品免费| 日韩免费在线观看视频| 日韩精品福利网站| 日韩av三级在线观看| 欧美在线视频在线播放完整版免费观看| 欧美午夜片在线免费观看| 亚洲欧美一区二区三区在线| 欧美国产一区二区三区| 亚洲综合中文字幕68页| 日韩av手机在线看| 欧美中文字幕在线播放| 97碰碰碰免费色视频| 欧洲成人性视频| 欧美成人黄色小视频| 国产精品伦子伦免费视频| www.亚洲天堂| 欧美日韩人人澡狠狠躁视频| 亚洲欧洲国产一区| 欧美精品久久久久久久免费观看| 久久九九精品99国产精品| 国产精品久久久av| 成人97在线观看视频| 亚洲国产第一页| 日韩欧美中文第一页| 亚洲激情久久久| 亚洲女人被黑人巨大进入al| 国产精品av在线播放| 欧美日韩国产一区中文午夜| 欧美激情xxxx性bbbb| 国产欧美精品一区二区| 国产精品偷伦视频免费观看国产| 欧美日韩免费区域视频在线观看| 久热精品视频在线免费观看| 亚洲精品一区久久久久久| 91九色国产视频| 97国产在线观看| 美女扒开尿口让男人操亚洲视频网站| 亚洲精品mp4| 欧美又大又硬又粗bbbbb| 美女少妇精品视频| 日韩高清av在线| 亚洲色图美腿丝袜| 精品久久久久久中文字幕一区奶水| 亚洲在线免费视频| 九九热视频这里只有精品| 久久精品成人欧美大片古装| 欧美日韩中文在线观看| 97精品久久久| 欧美黑人xxxx| 成人在线小视频| 91网站在线免费观看| 精品亚洲一区二区| 国产精品第一页在线| 亚州精品天堂中文字幕| 日韩精品999| 黄色成人av网| 久久精品视频导航| x99av成人免费| 国产成人a亚洲精品| 亚洲网站视频福利| 黑人巨大精品欧美一区二区免费| 国产欧美精品日韩| 丝袜一区二区三区| 中文字幕无线精品亚洲乱码一区| 国产成人一区二区三区| 中文字幕一区电影| 亚洲成人网在线| 久久精品国产成人精品| 正在播放亚洲1区| 少妇激情综合网| 精品视频久久久久久久| 久久99热精品这里久久精品| 欧美日韩高清在线观看| 亚洲精品久久久久中文字幕二区| 国产午夜精品全部视频播放|