亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

問題1:

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

}

alert('hello world!!!');

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

問題2:

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

問題3:

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

什么是單線程?

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

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

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

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

console.log(1);

// 1

// 0

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

什么是異步?

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

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

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

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

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

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

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

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

  

  2.動態(tài)創(chuàng)建script標簽  

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:當頁面加載完畢以后才去執(zhí)行這段代碼。

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

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

  

不過異步也是缺點的,比如下面這段代碼:

  正常代碼:    

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無法捕獲異步里面的代碼。

總結

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

相關文章

  • 總結一些js自定義的函數(shù)

    總結一些js自定義的函數(shù)

    總結一些js自定義的函數(shù)...
    2006-08-08
  • javascript使用正則獲取url上的某個參數(shù)

    javascript使用正則獲取url上的某個參數(shù)

    使用indexOf取得?之后的參數(shù),以&使split進行分割成數(shù)組,下面展示了一個從url上獲取名為MenuCode參數(shù)的過程
    2014-09-09
  • JS判斷客戶端是手機還是PC的2個代碼

    JS判斷客戶端是手機還是PC的2個代碼

    Javascript 判斷客戶端是否為 PC 還是手持設備,有時候項目中需要用到,很方便的檢測,源生的哦,方法一共有兩種
    2014-04-04
  • 在多個頁面使用同一個HTML片段《續(xù)》

    在多個頁面使用同一個HTML片段《續(xù)》

    上一篇文章中我們使用textarea來模擬AJAX的返回結果,造成了一些誤解。 這里我們首先用asp.net的Generic Handler做一個簡單的后臺來重現(xiàn)這個AJAX過程。
    2011-03-03
  • Javascript操作select控件代碼實例

    Javascript操作select控件代碼實例

    這篇文章主要介紹了Javascript操作select控件代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • 基于JavaScript實現(xiàn)手機短信按鈕倒計時(超簡單)

    基于JavaScript實現(xiàn)手機短信按鈕倒計時(超簡單)

    在淘寶等購物網站,我們都會看到一個發(fā)送短信倒計時的按鈕,究竟是如何實現(xiàn)的呢?下面小編通過本篇文章給大家分享一段代碼關于js實現(xiàn)手機短信按鈕倒計時,需要的朋友參考下
    2015-12-12
  • 簡單談談JS中的正則表達式

    簡單談談JS中的正則表達式

    下面小編就為大家?guī)硪黄唵握務凧S中的正則表達式。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 通過webpack引入第三方庫的方法

    通過webpack引入第三方庫的方法

    這篇文章主要介紹了通過webpack引入第三方庫的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Express與NodeJs創(chuàng)建服務器的兩種方法

    Express與NodeJs創(chuàng)建服務器的兩種方法

    本文主要介紹了NodeJs創(chuàng)建Web服務器;Express創(chuàng)建Web服務器的兩種方法,具有一定的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • JS延時提示框實現(xiàn)方法詳解

    JS延時提示框實現(xiàn)方法詳解

    這篇文章主要介紹了JS延時提示框實現(xiàn)方法,以實例形式較為詳細的分析了JavaScript實現(xiàn)延時提示功能的原理與具體實現(xiàn)步驟,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11

最新評論