最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

再談Javascript中的異步以及如何異步

 更新時(shí)間:2016年08月19日 17:15:15   投稿:daisy  
大家都知道js是單線程的,執(zhí)行起來是順序的,在順序的業(yè)務(wù)邏輯中當(dāng)然沒有問題,如果遇到可以并發(fā)執(zhí)行的業(yè)務(wù)邏輯,再排隊(duì)就很低級了!所以這里我們再來簡單的談?wù)凧S中的異步以及如何異步。

為什么需要異步?why?來看一段代碼。

問題1:

for(var i=0;i<100000;i++){

}

alert('hello world!!!');

  這段代碼的意思是執(zhí)行100...次后再執(zhí)行alert,這樣帶來的問題是,嚴(yán)重堵塞了后面代碼的執(zhí)行,至于為什么,主要是因?yàn)镴S是單線程的。

問題2:

  我們通常要解決這樣一個(gè)問題,如果我們需要在head里面加入script代碼的話,一般會(huì)將代碼寫在window.onload里面(如果操作了dom的話),你有沒有想過,為什么要加window.onload?原因就是你在操作dom的時(shí)候script后面的html代碼瀏覽器還沒有開始加載,結(jié)果人家還沒有出生你就想著去娶她,這可能嗎?當(dāng)然不可能,加上window。onload之所以可以是因?yàn)椋?code>window.onload里面的代碼是在文檔全部加載完畢后執(zhí)行的,也就相當(dāng)于異步。

問題3:

  有時(shí)候頁面并不需要一次性把所有的代碼都加載,更多的時(shí)候我們是按照某個(gè)需求才去加載某段代碼的。 

什么是單線程?

  你可以這樣理解單線程就是代碼一段一段的執(zhí)行,先執(zhí)行前面的,前面的執(zhí)行完了再執(zhí)行后面的。 

那JS中有哪些是異步的呢?

  我相信這個(gè)東西,幾乎都用爛了,它就是setTimeout/setInterval當(dāng)然還有Ajax,Ajax異步我相信大家都知道,當(dāng)然也可以同步但沒人那么去做,但是對于setTimeout和setInterval是異步可能有些小伙伴不同了解,下面說說為什么說setTimeout是異步的。

setTimeout(function(){
  console.log(0);
},0)

console.log(1);

// 1

// 0

運(yùn)行這段代碼后先打印的是1,而不是0,有些小伙伴是不是開始迷惑了,這里我們雖然給setTimeout設(shè)置的是0秒后執(zhí)行console.log(0)  ,但是這個(gè)setTimeout很特別,因?yàn)樗钱惒降?,我們先拋開這里為什么打印的是1然后才是0,先來聊聊什么是異步。 

什么是異步?

  比方說有些飯店你去吃飯需要提前預(yù)定,等其他人吃完你才能去,因此在其他人吃飯的時(shí)候你可以去干其他的事情,等其他人吃完了會(huì)有人來通知你,于是你可以去了,那么對于代碼來說,如ajax,你定義了一個(gè)回調(diào)方法,這個(gè)回調(diào)方法并不會(huì)當(dāng)時(shí)就去執(zhí)行,而是等待服務(wù)器響應(yīng)完成之后才會(huì)去執(zhí)行這段代碼。 

我們回到前面那段setTimeout身上,它的工作原理是這樣的,當(dāng)你定義setTimeout那一刻起(不管時(shí)間是不是0),js并不會(huì)直接去執(zhí)行這段代碼,而是把它扔到一個(gè)事件隊(duì)列里面,當(dāng)頁面中所有同步任務(wù)都干完了以后,才會(huì)去執(zhí)行事件隊(duì)列里面的代碼。什么是同步,除了異步代碼就是同步—_—。 

JS怎么實(shí)現(xiàn)異步?

  1.利用setTimout實(shí)現(xiàn)異步    

setTimeout(function(){
  console.log(document.getElementByTagName('body')[0]);
},0)

  但是setTimeout有些小小的問題,就是時(shí)間不精確,如果你想更快的執(zhí)行這段代碼我們可以使用html5提供的一個(gè)函數(shù)?! ?/p>

requestAnimationFrame(function(){
  console.log(document.getElementByTagName('body')[0]);
})

  requestAnimationFrame和setTimeout的區(qū)別就在于requestAnimationFrame比setTimeout更快執(zhí)行,因此很多人用requestAnimationFrame來制作動(dòng)畫。

  

  2.動(dòng)態(tài)創(chuàng)建script標(biāo)簽  

var head = document.getElementByTagName('head')[0];
var script = document.createElement('script');
script.src = '追夢子.js';
head.appendChild('script');

   3.利用script提供的defer/async

  <script src="xx.js" defer></script>

  defer:當(dāng)頁面加載完畢以后才去執(zhí)行這段代碼。

  <script src="xx.js" async></script>

  async:異步執(zhí)行script代碼

  

不過異步也是缺點(diǎn)的,比如下面這段代碼:

  正常代碼:    

try{
  throw new Error('hello world');
}catch(err){
  console.log(err);
}

// Error: hello world(…)

  異步代碼:  

try{
  setTimout(function(){
    throw new Error('hello world');
  },0)
}catch(err){
  console.log(err);
}

// ReferenceError: setTimout is not defined(…)

可以發(fā)現(xiàn)catch里面的代碼并沒有執(zhí)行,也就是說try無法捕獲異步里面的代碼。

總結(jié)

關(guān)于JS中的異步以及如何異步到這就基本結(jié)束,關(guān)于JS的異步算是老生常談了,但是還是希望本文的內(nèi)容對大家能有一些幫助。

相關(guān)文章

  • JS組件Bootstrap dropdown組件擴(kuò)展hover事件

    JS組件Bootstrap dropdown組件擴(kuò)展hover事件

    bootstrap的下拉組件,需要點(diǎn)擊click時(shí),方可展示下拉列表。因此對于喜歡簡單少操作的大家來說,點(diǎn)擊一下多少帶來不便,因此,引入hover監(jiān)聽,鼠標(biāo)經(jīng)過自動(dòng)展示下拉框。這篇文章主要介紹了JS組件Bootstrap dropdown組件擴(kuò)展hover事件,感興趣的小伙伴們可以參考一下
    2016-04-04
  • 純javascript實(shí)現(xiàn)分頁(兩種方法)

    純javascript實(shí)現(xiàn)分頁(兩種方法)

    有的時(shí)候頁面需要很多不同的表組成的數(shù)據(jù),該怎么分頁呢?使用數(shù)據(jù)庫分頁很簡單,那么如何使用js實(shí)現(xiàn)分頁呢?接下來,小編幫大家解決這個(gè)問題,需要的朋友一起來學(xué)習(xí)吧
    2015-08-08
  • 詳解基于Wepy開發(fā)小程序插件(推薦)

    詳解基于Wepy開發(fā)小程序插件(推薦)

    這篇文章主要介紹了詳解基于Wepy開發(fā)小程序插件(推薦),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-08-08
  • GoJs連線上的信息展示使用詳解

    GoJs連線上的信息展示使用詳解

    這篇文章主要為大家介紹了GoJs連線上的信息展示使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Javascript實(shí)現(xiàn)的簡單右鍵菜單類

    Javascript實(shí)現(xiàn)的簡單右鍵菜單類

    這篇文章主要介紹了Javascript實(shí)現(xiàn)的簡單右鍵菜單類,通過JavaScript自定義類實(shí)現(xiàn)右鍵菜單功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • Bootstrap每天必學(xué)之媒體對象

    Bootstrap每天必學(xué)之媒體對象

    Bootstrap每天必學(xué)之媒體對象,對BootBootstrap每天必學(xué)之媒體對象小編也了解的很少,希望通過這篇文章和大家更多的去學(xué)習(xí)Bootstrap每天必學(xué)之媒體對象,從中得到收獲。
    2015-11-11
  • JS傳參及動(dòng)態(tài)修改頁面布局

    JS傳參及動(dòng)態(tài)修改頁面布局

    本篇文章主要介紹了JS傳參及動(dòng)態(tài)修改頁面布局的相關(guān)知識。具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-04-04
  • uni-app使用uniCloud實(shí)現(xiàn)圖形驗(yàn)證碼(uni-captcha)詳細(xì)過程

    uni-app使用uniCloud實(shí)現(xiàn)圖形驗(yàn)證碼(uni-captcha)詳細(xì)過程

    這篇文章主要給大家介紹了關(guān)于uni-app使用uniCloud實(shí)現(xiàn)圖形驗(yàn)證碼(uni-captcha)的相關(guān)資料,實(shí)際開發(fā)工作中在登陸的時(shí)候經(jīng)常需要圖形驗(yàn)證碼,需要的朋友可以參考下
    2023-07-07
  • JS如何實(shí)現(xiàn)基于websocket的多端橋接平臺(tái)

    JS如何實(shí)現(xiàn)基于websocket的多端橋接平臺(tái)

    我們在調(diào)試過程使用的工具有:modheader,postman等,但這些工具都會(huì)存在的問題:缺少客戶端里相應(yīng)的設(shè)備信息;即使將cookie信息復(fù)制出來,也是存在過期的問題;多個(gè)設(shè)備之間切換時(shí)不方便;針對這些存在的問題,我基于websocket雙向通信的特點(diǎn),實(shí)現(xiàn)了多端橋接管理平臺(tái)
    2021-05-05
  • 原生JS實(shí)現(xiàn)的簡單小鐘表功能示例

    原生JS實(shí)現(xiàn)的簡單小鐘表功能示例

    這篇文章主要介紹了原生JS實(shí)現(xiàn)的簡單小鐘表功能,涉及javascript結(jié)合定時(shí)器的數(shù)值運(yùn)算與頁面元素屬性動(dòng)態(tài)修改相關(guān)操作技巧,需要的朋友可以參考下
    2018-08-08

最新評論

龙海市| 甘洛县| 方城县| 涡阳县| 太仆寺旗| 大石桥市| 旬阳县| 襄城县| 瑞丽市| 神池县| 龙海市| 梧州市| 荔波县| 扶风县| 沙田区| 五峰| 土默特左旗| 崇阳县| 青海省| 自贡市| 金川县| 花莲县| 铁岭市| 邢台县| 遵义县| 闵行区| 呼图壁县| 襄垣县| 囊谦县| 八宿县| 延安市| 淳化县| 抚松县| 六盘水市| 新民市| 轮台县| 铅山县| 田阳县| 金溪县| 桂平市| 麻栗坡县|