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

首頁 > 開發 > AJAX > 正文

解決js ajax同步請求造成瀏覽器假死的問題

2024-09-01 08:33:56
字體:
來源:轉載
供稿:網友

一、問題的起因

今天做一個需求遇到了這么個情況,就是用戶個人中心有個功能,點擊按鈕,可以刷新用戶當前的積分,這個肯定需要使用到ajax的同步請求了,當時喀喀喀三下五除二寫玩了,大概代碼如下:

/**  * 異步當前用戶積分 by zgw 20161216  * @return {[type]} [description] */ function flushIntegralSum() {     //點擊按鈕刷新前修改按鈕的文案,已經去掉點擊事情,防止多次點擊  $("#flushbutton").replaceWith('<a style="color:#3fb0ff;font-size:14px;" href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" id="flushbutton">正在刷新</a>');  $.ajax({   url:'URL',   type:'post',   async:false,   // data:{},   success:function(json){    json = eval('('+json+')');    if(json.url){window.location.href=json.url;return;}    $("#flushbutton").replaceWith('<a style="color:#3fb0ff;font-size:14px;" href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" onclick="flushFreeSum();" id="flushbutton">刷新積分</a>');    if(json.code!=1){     alert(json.msg);    }else{     $("#free_sum").html(json.free_sum);    }    return;   }  }); }

本以為這么簡單的功能喀喀喀隨便寫寫就沒事了,在運行的時候出現了問題,當用戶點擊刷新積分按鈕時,文案沒有修改為"正在刷新",但是ajax請求發送了,于是我查看網頁代碼,發現js其實把文案和html元素綁定的onclick事件去掉了,在請求成功后有變回原來的了,但是頁面上邊文案沒有改變,當時很奇怪,不知道為什么html代碼里邊改變了,頁面卻沒有變點變化

二、了解問題原因

問題的根源:當時我進行了排查,最后發現是 "async:false" 的問題,換成異步的就沒有問題了,那為什么同步請求會產生代碼失效的問題呢?

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

三、解決問題

1.我當時使用了 setTimeout 來解決,把ajax代碼放在sestTimeout中,讓瀏覽器重啟一個線程來操作,這樣就解決問題了,代碼如下:

function flushIntegralSum() {     //點擊按鈕刷新前修改按鈕的文案,已經去掉點擊事情,防止多次點擊  $("#flushbutton").replaceWith('<a style="color:#3fb0ff;font-size:14px;" href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" id="flushbutton">正在刷新</a>');  setTimeout(function(){   $.ajax({    url:'URL',    type:'post',    async:false,    // data:{},    success:function(json){     json = eval('('+json+')');     if(json.url){window.location.href=json.url;return;}     $("#flushbutton").replaceWith('<a style="color:#3fb0ff;font-size:14px;" href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" onclick="flushFreeSum();" id="flushbutton">刷新積分</a>');     if(json.code!=1){      alert(json.msg);     }else{      $("#free_sum").html(json.free_sum);     }     return;    }   });  },0)  }

setTimeout的第二個參數設為0,瀏覽器會在一個已設的最小時間后執行

到這里問題就解決了,但是你可以試試當你點擊按鈕的時候如果需要彈出一個gif圖片,并且圖片一直在旋轉,提示更新中,你會發現圖片雖然會顯示,但是圖片卻是不動的,那是因為雖然同步請求延遲執行了,但是它執行期間還是會把UI線程給阻塞。這個阻塞相當牛逼,連gif圖片都不動了,看起來像一張靜態圖片一樣。結論很明顯,setTimeout治標不治本,相當于把同步請求“稍稍”異步了一下,接下來還是會進入同步的噩夢,阻塞線程,這種方法只適合發請求之前操作簡單的時間短的情況

2.使用 Deferred 來解決

以上這篇解決js ajax同步請求造成瀏覽器假死的問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲免费的视频看| 日韩大陆毛片av| 国产亚洲精品久久久久久777| 国产精品一区电影| 久久久极品av| 欧美与黑人午夜性猛交久久久| 国产精品一区二区三区免费视频| 在线观看国产精品淫| 国产精品久久婷婷六月丁香| 国产精品久久久久久久午夜| 永久免费看mv网站入口亚洲| 亚洲人在线视频| 久久国产精品久久精品| 成人写真视频福利网| 日韩美女写真福利在线观看| 3344国产精品免费看| 午夜美女久久久久爽久久| 国产精品久久久久免费a∨大胸| 国产精品永久在线| 亚洲图片在线综合| 91国偷自产一区二区三区的观看方式| 欧美日韩亚洲一区二区| 亚洲桃花岛网站| 亚洲欧洲一区二区三区久久| 国产视频一区在线| 国产视频精品一区二区三区| 成人欧美一区二区三区在线| 亚洲综合在线做性| 中文字幕亚洲欧美一区二区三区| 色综久久综合桃花网| 2020久久国产精品| 日韩欧美视频一区二区三区| 中文国产成人精品久久一| 国产精品视频专区| 久久国产视频网站| 欧美精品www| 午夜精品国产精品大乳美女| 九九热视频这里只有精品| 日本久久91av| 亚洲国产精品悠悠久久琪琪| 精品视频—区二区三区免费| 国产精品日韩欧美| 国产婷婷成人久久av免费高清| 国模视频一区二区三区| 国产精品亚洲综合天堂夜夜| 国产精彩精品视频| 亚洲第一男人天堂| 精品动漫一区二区三区| 欧美黄色片免费观看| 日韩a**站在线观看| 亚洲成人免费在线视频| 国产91在线播放| 欧美日韩国内自拍| 日韩电影中文字幕在线观看| 国产精品精品国产| 欧美久久精品一级黑人c片| 精品国产一区久久久| 久久久精品中文字幕| 国内精品400部情侣激情| 国产精品视频网站| 亚洲精品动漫100p| 国产成人精品久久二区二区91| 国产美女精彩久久| 欧美日韩福利电影| 亚洲精品v欧美精品v日韩精品| 另类色图亚洲色图| 成人免费午夜电影| 欧美日韩国产中文精品字幕自在自线| 国产精品爽爽爽| 在线播放国产一区中文字幕剧情欧美| 国产成人在线一区| 黑人巨大精品欧美一区免费视频| 精品国产999| 日韩美女视频中文字幕| 欧美大片免费观看在线观看网站推荐| 亚洲精品视频网上网址在线观看| 亚洲国产日韩欧美在线图片| 国产精品久久综合av爱欲tv| 国产日韩在线看| 91av视频在线观看| 久久精品国产91精品亚洲| 久久久久国产一区二区三区| 亚洲成人黄色在线观看| 欧美www视频在线观看| 欧美野外猛男的大粗鳮| 国产在线视频不卡| 国产99久久精品一区二区永久免费| 欧美成人精品三级在线观看| 久久久久久久爱| 国产精品久久激情| 中文字幕欧美精品日韩中文字幕| 国产精品久久久久999| 国产精品丝袜高跟| 欧美激情videos| 久久亚洲影音av资源网| 成人免费淫片aa视频免费| 亚洲男人天堂九九视频| 一区国产精品视频| 97国产精品久久| 亚洲人成伊人成综合网久久久| 国产精品中文字幕在线| 欧美影院成年免费版| 国产精品久久久久久久久久久新郎| 色综合老司机第九色激情| 久久久免费精品| 日韩精品黄色网| 久久国产精品偷| 一本大道久久加勒比香蕉| www亚洲欧美| 国产一区av在线| 国语自产偷拍精品视频偷| 国产精品一区二区性色av| 亚洲一区二区自拍| 日韩欧美在线国产| 激情久久av一区av二区av三区| 一区二区亚洲欧洲国产日韩| 国产精品视频午夜| 国产久一一精品| 欧洲成人午夜免费大片| 欧美精品在线播放| 欧美床上激情在线观看| 97成人精品视频在线观看| 日本精品在线视频| 久久精品国产96久久久香蕉| 国产成人精品免费视频| 国产一区二区三区在线观看视频| xxx成人少妇69| 91精品久久久久久久| 久青草国产97香蕉在线视频| 欧美日韩第一页| 日韩精品高清在线| **欧美日韩vr在线| 亚洲一区中文字幕| 欧洲亚洲妇女av| 国产美女扒开尿口久久久| www.日韩系列| 成人免费激情视频| 一区二区三区四区精品| 国外色69视频在线观看| 亚洲成人1234| 国产精品精品久久久久久| 欧美日韩国产一区在线| 国产亚洲成精品久久| 国产综合在线观看视频| 日韩av一区二区在线| 国产精品流白浆视频| 欧美www视频在线观看| 美女黄色丝袜一区| 欧美日韩精品在线播放| 国产精品欧美一区二区三区奶水| 日韩美女免费观看| 亚洲在线视频观看| 亚洲另类图片色| 精品亚洲男同gayvideo网站| 欧美视频在线免费看| 九九热这里只有精品免费看| 黑人狂躁日本妞一区二区三区| 亚洲精品久久久久久久久久久久| 亚洲一区二区久久久| 欧美国产日韩一区二区三区| 911国产网站尤物在线观看| 亚洲字幕一区二区| 国产精品一二三在线| 精品中文字幕在线2019|