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

實例分析javascript中的異步

 更新時間:2020年06月02日 10:52:36   作者:蝴蝶刀刀  
這篇文章主要介紹的JS中異步的用法,實例代碼簡單易懂,方便大家更好的學習,有興趣的朋友可以參考下

js 異步解析

一 、js單線程分析

     我們都知道js的一大特點是單線程,也就是同一時間點,只能處理一件事,一句js代碼。那為什么js要設(shè)計成單線程而不是多線程呢?這主要和js的用途有關(guān),js作為瀏覽器端的腳本語言,主要的用途為用戶與服務(wù)端的交互與操作dom。而操作dom就注定了js只能是單線程語言。假如js才取多線程將會出現(xiàn),多個線程同時對一個dom進行操作的情況,瀏覽器將無法判斷如何渲染。不僅js是單線程,瀏覽器渲染dom也是單線程的,js的執(zhí)行和瀏覽器渲染dom共用的一個線程,這就導致了在html代碼中書寫js代碼會造成瀏覽器端渲染的阻塞。例如:在html某個位置,寫一個段帶有alert(‘稍等'),alert 之前html已經(jīng)被渲染出來,而alert之后的html被這段js阻塞了。為了利用多核CPU的計算能力,HTML5提出Web Worker標準,允許JavaScript腳本創(chuàng)建多個線程,但是子線程完 全受主線程控制,且不可進行DOM操作。所以,這個新標準并沒有改變JavaScript單線程的本質(zhì)。

     所謂的js單線程,是指在瀏覽器中JS引擎負責解釋和執(zhí)行JavaScript代碼的線程只有一個。不妨叫它主線程。但是實際上瀏覽器處理js還存在其他的線程。例如:處理AJAX請求的線程、處理DOM事件的線程、定時器線程、讀寫文件的線程(例如在Node.js中)等等。這些線程可能存在于JS引擎之內(nèi),也可能存在于JS引擎之外,在此我們不做區(qū)分。不妨叫它們工作線程

     總結(jié)一下:js之所以才取單線程模式是為了避免DOM渲染沖突。而瀏覽器中執(zhí)行js線程是單線程我們稱它為主線程,同時還存在其它處理js的線程,我們稱它為工作線程。js是單線程,但瀏覽器是多線程的。

二 、同步與異步

     單線程就意味著,所有任務(wù)需要排隊,前一個任務(wù)結(jié)束,才會執(zhí)行后一個任務(wù)。如果前一個任務(wù)耗時很長,后一個任務(wù)就不得不一直等著。這就是同步代碼阻塞。如果排隊是因為計算量大,CPU忙不過來,倒也算了,但是很多時候CPU是閑著的,因為IO設(shè)備(輸入輸出設(shè)備)很慢(比如Ajax操作從網(wǎng)絡(luò)讀取數(shù)據(jù)),不得不等著結(jié)果出來,再往下執(zhí)行。JavaScript語言的設(shè)計者意識到,這時主線程完全可以不管IO設(shè)備,掛起處于等待中的任務(wù),先運行排在后面的任務(wù)。等到IO設(shè)備返回了結(jié)果,再回過頭,把掛起的任務(wù)繼續(xù)執(zhí)行下去。

     簡單的說,同步就是會阻塞代碼的執(zhí)行,而異步不會。同樣拿alert('稍等') 來舉例,在一段js代碼中加入一段alert,如果沒有點擊確認,此時代碼的執(zhí)行就被阻塞了,大多數(shù)js代碼都是同步執(zhí)行的。異步則相反。那為什么js中要引入異步的概念呢,很簡單,由于js的單線程,當遇到耗時的操作時如果采用同步的執(zhí)行,那么我們就不可能看到如今這么流暢的web應(yīng)用了。再舉個簡單的例子:在一條單行道上行駛著很多汽車,假如其中某一輛車出現(xiàn)機械故障,將會導致后面的車也無法通過,此時應(yīng)該將故障的車拉入旁邊的應(yīng)急車道進行修復,待它修好之后再重新駛?cè)胫鞲傻乐校粫绊懼鞲傻榔渌旭偟钠?。所以,異步是js單線程下解決耗時問題的一種“無可奈何”的解決方案。也是一種近乎完美的解決方案。

三、js異步與事件輪詢

     事件輪詢(event loop)是js異步的實現(xiàn)方式。簡而言之,在js單線程中分為兩種任務(wù),一種是同步任務(wù)(synchronous),另一種是異步任務(wù)(asynchronous)。同步任務(wù)指的是,在主線程上排隊執(zhí)行的任務(wù),只有前一個任務(wù)執(zhí)行完畢,才能執(zhí)行后一個任務(wù);異步任務(wù)指的是,不進入主線程、而進入”任務(wù)隊列”(task queue)的任務(wù),只有當主進程中所有同步任務(wù)執(zhí)行完畢,且”任務(wù)隊列”通知主線程,某個異步任務(wù)可以執(zhí)行了,該任務(wù)才會進入主線程執(zhí)行。事件輪詢就是將主線程中的異步任務(wù)掛載到任務(wù)隊列中,再待到合的時機,將任務(wù)隊列中的異步函數(shù)拉到主進程來執(zhí)行的這么一個流程。

js中異步操作主要有:

     1、定時任務(wù)(setTimeout、setInterval)

     2、網(wǎng)路請求(ajax、動態(tài)<img>加載)

     3、事件綁定(click,focus,change等)

 js異步具體執(zhí)行流程分析

     大家看一下左邊代碼,兩個console.log操作,兩個setTitmeout 操作。按照我們對異步的理解,在主線程中 console.log 為同步任務(wù)從上到下依次執(zhí)行,所以在最先打印的是3,當執(zhí)行到第一setTimeout時,瀏覽器js引擎會自動將setTimeout放入工作線程中。ps:在工作線程中,待0.1s后將setTimeout 的回調(diào)函數(shù)放入異步隊列中;主進程中下一個setTimeout ,但是它的延遲時間為0,這并不意味著它能同步執(zhí)行,它依舊經(jīng)歷如上兩個過程,從工作進程中,0s后放入任務(wù)隊列。接下來是執(zhí)行console.log(3);當主進程中任務(wù)已經(jīng)執(zhí)行完畢。任務(wù)隊列中有一個監(jiān)視器,隨時監(jiān)視著主進程和任務(wù)隊列中的異步函數(shù)情況,當主進程執(zhí)行完畢,就判斷任務(wù)隊列中是否有需要執(zhí)行的函數(shù),如果有就按照隊列現(xiàn)后順序依次放入主進程中,以此往復。

     所以上面代碼,依次打印為:3,3,2,1。也就是先將非異步執(zhí)行完,再回過頭來執(zhí)行異步函數(shù),異步函數(shù)執(zhí)行順序為隊列規(guī)則,先進先出,也就是先進入隊列的異步函數(shù)將優(yōu)先執(zhí)行。

     思考:如果一段代碼中現(xiàn)后存在一個ajax 和一個1s的定時函數(shù),那么他們誰先執(zhí)行呢? 答案是:不確定。因為不確定ajax請求完畢進入隊列的時間。小伙伴們可別被面試管套路了哦。哈哈。

四、前端異步的寫法

     1、回調(diào)函數(shù),也就是在setTimeout或者ajax中添加回調(diào)函數(shù),待到指定時間后或者請求到數(shù)據(jù)后再執(zhí)行回調(diào)。

     2、ES6標準:Promise,ES7:async await   這兩種都只是js事件輪詢實現(xiàn)異步的一種優(yōu)雅的 方式,將異步變?yōu)橥降膶懛?,但都并未改變js異步本質(zhì)。

以上就是實例分析javascript中的異步的詳細內(nèi)容,更多關(guān)于javascript 異步的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • js如何刪除對象/數(shù)組中null、undefined、空對象及空數(shù)組實例代碼

    js如何刪除對象/數(shù)組中null、undefined、空對象及空數(shù)組實例代碼

    JS中數(shù)組是我們較為常用的一種數(shù)據(jù)結(jié)構(gòu),下面這篇文章主要給大家介紹了關(guān)于js如何刪除對象/數(shù)組中null、undefined、空對象及空數(shù)組的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • 用JavaScript修改CSS屬性的代碼

    用JavaScript修改CSS屬性的代碼

    這篇文章主要介紹用原生的javascript修改CSS屬性的方法,需要的朋友可以參考下
    2013-05-05
  • bootstrap手風琴制作方法詳解

    bootstrap手風琴制作方法詳解

    這篇文章主要為大家詳細介紹了bootstrap手風琴的制作方法,制作聲明式觸發(fā)手風琴,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • 操作按鈕懸浮固定在微信小程序底部的實現(xiàn)代碼

    操作按鈕懸浮固定在微信小程序底部的實現(xiàn)代碼

    在一些購物平臺經(jīng)常需要將商品加入購物車,像加入購物車按鈕、結(jié)算按鈕、收貨列表添加地址按鈕都是按鈕懸浮底部的,怎么實現(xiàn)這樣的功能呢?下面小編給大家?guī)砹瞬僮靼粹o懸浮固定在微信小程序底部的實現(xiàn)代碼,一起看看吧
    2019-08-08
  • HTML的select控件美化

    HTML的select控件美化

    本文主要介紹了HTML的select控件美化以及js實現(xiàn)select選擇功能的方法步驟。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • javascript彈出層輸入框(示例代碼)

    javascript彈出層輸入框(示例代碼)

    這篇文章主要介紹了javascript彈出層輸入框(示例代碼)。需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12
  • CKeditor4 字體顏色功能配置方法教程

    CKeditor4 字體顏色功能配置方法教程

    這篇文章主要介紹了CKeditor4 字體顏色功能配置方法,結(jié)合圖文與實例的形式分析了CKeditor4 添加字體顏色擴展功能的相關(guān)實現(xiàn)步驟與操作技巧,需要的朋友可以參考下
    2019-06-06
  • vscode工具函數(shù)idGenerator使用深度解析

    vscode工具函數(shù)idGenerator使用深度解析

    這篇文章主要為大家介紹了vscode工具函數(shù)idGenerator使用深度解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • 關(guān)于Javascript與iframe的那些事兒

    關(guān)于Javascript與iframe的那些事兒

    iframe 很多網(wǎng)站都在用,雖然方便開發(fā)與維護(可能同時有幾個頁面調(diào)用同一個 iframe ),不過卻存在安全問題
    2013-07-07
  • TypeScript利用TS封裝Axios實戰(zhàn)

    TypeScript利用TS封裝Axios實戰(zhàn)

    這篇文章主要介紹了TypeScript利用TS封裝Axios實戰(zhàn),TypeScript封裝一遍Axios,能進一步鞏固TypeScript的基礎(chǔ)知識,需要的小伙伴可以參考一下
    2022-06-06

最新評論