国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

js 同步與異步

這篇具有很好參考價(jià)值的文章主要介紹了js 同步與異步。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、js 執(zhí)行機(jī)制

JavaScript語言的一大特點(diǎn)就是單線程,即(同一時(shí)間只能做一件事情)。因?yàn)镴avaScript是為了處理頁面中用戶的交互,以及操作DOM而誕生的。比如對某個(gè)DOM元素進(jìn)行添加和刪除操作。不能同時(shí)進(jìn)行,應(yīng)該先進(jìn)行添加,再進(jìn)行刪除。

單線程就意味著,所有任務(wù)需要排隊(duì),前一個(gè)任務(wù)結(jié)束,才會執(zhí)行后一個(gè)任務(wù)。這樣所導(dǎo)致的問題是∶如果JS執(zhí)行的時(shí)間過長,這樣就會造成頁面的渲染不連貫,導(dǎo)致頁面渲染加載阻塞的感覺。所以HTML5提出Web Worker標(biāo)準(zhǔn),允許JavaScript腳本創(chuàng)建多個(gè)線程,于是,js中出現(xiàn)了 同步 異步

二、同步和異步

同步任務(wù):前一個(gè)任務(wù)結(jié)束后再執(zhí)行后一個(gè)任務(wù),程序的執(zhí)行順序與任務(wù)的排列順序是一致的。

異步任務(wù):多任務(wù)多線程,比如:做一件事的同時(shí),可以去做其他事情。

解釋:

同步任務(wù)都在主線程上執(zhí)行,形成一個(gè)執(zhí)行棧。

異步任務(wù)(js的異步是通過回調(diào)函數(shù)實(shí)現(xiàn)的放入到消息隊(duì)列中)比如:

① 普通的事件。click、resize等
② 資料加載,load、error 等
③ 定時(shí)器,setInterval、setTimeout等

三、執(zhí)行順序

①先執(zhí)行執(zhí)行棧中的同步任務(wù)
② 異步任務(wù)(回調(diào)函數(shù))放入任務(wù)隊(duì)列中
③ 一旦執(zhí)行棧中的所有同步任務(wù)執(zhí)行完畢,系統(tǒng)就會按次序讀取任務(wù)隊(duì)列中的異步任務(wù),于是被讀取的異步任務(wù)結(jié)束等待狀態(tài),進(jìn)入執(zhí)行棧,開始執(zhí)行。

?如圖:

js 同步 異步,JavaScript,javascript,前端,開發(fā)語言

?四、事件循環(huán)

?我們把任務(wù)分為同步任務(wù)異步任務(wù)。js把異步任務(wù)分為宏任務(wù)微任務(wù)

在es5之后,JavaScript引入了promise,這樣不需要瀏覽器,JavaScript引擎自身也能夠發(fā)起異步任務(wù)了。

宏任務(wù) 由(瀏覽器、node發(fā)起)、
微任務(wù) 由(js引擎發(fā)起的任務(wù))比如promise(Promise本身是同步的,then/catch的回調(diào)函數(shù)是異步的)

所以我們把代碼可能分為3種

① 同步代碼(js執(zhí)行棧/回調(diào)棧)
② 微任務(wù)的異步代碼(js引擎)
? ?process.nextTick (node)
? ?promise.then( ) catch( )? ? ? ? ? ? ?Promise本身是同步,then/catch的回調(diào)函數(shù)是異步的微任務(wù)
?
?Async/Await?
? ?Object.observer等等
③ 宏任務(wù)的異步代碼
? ?script(代碼塊)
? ?setTimeout/ setInterval定時(shí)器
? ?setImmediate 定時(shí)器
再看三種代碼的執(zhí)行順序:
同步代碼 →→→→微任務(wù)的異步代碼(promise等)? →→→→宏任務(wù)的異步代碼(setTimeout/ setInterval等)

如圖:

js 同步 異步,JavaScript,javascript,前端,開發(fā)語言

五、案列

5-1案例:

<script>
    console.log(1);
    setTimeout(function() {
        console.log(2);
    },0)

    const p = new Promise((res,rej)=> {
        console.log(3);
        res(1000)
        console.log(4);
    }).then(data=> {
        console.log(data);
    })
    console.log(5);  //結(jié)果為 1 3 4 5 1000 2 
</script>

分析:

js 同步 異步,JavaScript,javascript,前端,開發(fā)語言

?5-2案例:

<script>
   new Promise((resolve,reject)=> {
        resolve(1)
        new Promise((resolve,reject)=> {
            resolve(2)
        }).then(data => {
            console.log(data);
        })
    }).then(data=> {
        console.log(data);
    })
    console.log(3);
    // 3 2 1
</script>

?5-3案例:

<script>
   setTimeout(() => {
        console.log(1);
    }, 0)
    new Promise((resolve, reject) => {
        console.log(2);
        resolve('p1')
        new Promise((resolve, reject) => {
            console.log(3);
            setTimeout(() => {
                resolve('setTimeout2')
                console.log(4);
            }, 0)
            resolve('p2')
        }).then(data => {
            console.log(data);
        })

        setTimeout(() => {
            resolve('setTimeout1')
            console.log(5);
        }, 0)
    }).then(data1 => {
        console.log(data1);
    })
    console.log(6);
  // 2 3 6 p2 p1 1 4 5
</script>

?分析:

js 同步 異步,JavaScript,javascript,前端,開發(fā)語言

???????5-4案例:

<script>
   async function async1() {
        console.log('async1 start');
        await async2();
        console.log('async1 end');
    }
    async function async2() {
        console.log('async2');
    }
    console.log('script start');
    setTimeout(()=> {
        console.log('setTimeout');
    },0)
    async1();
</script>

分析:

js 同步 異步,JavaScript,javascript,前端,開發(fā)語言

????????5-5案例:文章來源地址http://www.zghlxwxcb.cn/news/detail-735204.html

<script>
    setTimeout(() => {
        console.log(0);
    }, 0)
    new Promise((res, rej) => {
        console.log(1);
        res();
    }).then(() => {
        console.log(2);
        new Promise((res, rej) => {
            console.log(3);
            res();
        }).then(() => {
            console.log(4);
        }).then(() => {
            console.log(5);
        })
    }).then(() => {
        console.log(6);
    })
    new Promise((resolve, reject) => {
        console.log(7);
        resolve(8);
    }).then((data) => {
        console.log(data);
        console.log(9);
    })
    //結(jié)果為???
</script>

到了這里,關(guān)于js 同步與異步的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • jQuery.js - 前端必備的Javascript庫

    jQuery.js - 前端必備的Javascript庫

    作者: WangMin 格言: 努力做好自己喜歡的每一件事 jQuery.js 是什么? jQuery是一個(gè)快速簡潔、免費(fèi)開源易用的JavaScript框架, 倡導(dǎo)寫更少的代碼,做更多的事情 。它封裝JavaScript常用的功能代碼,提供了一種簡便的JavaScript設(shè)計(jì)模式,以及我們開發(fā)中常用到的操作DOM的API,優(yōu)化HTML文

    2024年02月05日
    瀏覽(90)
  • web前端框架JS學(xué)習(xí)之JavaScript類型轉(zhuǎn)換

    web前端框架JS學(xué)習(xí)之JavaScript類型轉(zhuǎn)換

    vascript有多種數(shù)據(jù)類型,如字符串、數(shù)字、布爾等,可以通過typeof語句來查看變量的數(shù)據(jù)類型。數(shù)據(jù)類型轉(zhuǎn)換就是數(shù)據(jù)類型之間相互轉(zhuǎn)換,比如把數(shù)字轉(zhuǎn)成字符串、把布爾值轉(zhuǎn)成字符串、把字符串轉(zhuǎn)成數(shù)字等,這在工作也是經(jīng)常碰到的。 本期我們就給大家說說web前端框架JS學(xué)

    2024年02月10日
    瀏覽(90)
  • 【JavaScript】3.4 JavaScript在現(xiàn)代前端開發(fā)中的應(yīng)用

    【JavaScript】3.4 JavaScript在現(xiàn)代前端開發(fā)中的應(yīng)用

    JavaScript 是現(xiàn)代前端開發(fā)的核心。無論是交互效果,還是復(fù)雜的前端應(yīng)用,JavaScript 都發(fā)揮著關(guān)鍵作用。在本章節(jié)中,我們將探討 JavaScript 在現(xiàn)代前端開發(fā)中的應(yīng)用,包括如何使用 JavaScript 來處理用戶交互、動態(tài)內(nèi)容、前端路由、API 請求等。 JavaScript 是處理用戶交互的主要工

    2024年02月04日
    瀏覽(26)
  • 〖大前端 - 基礎(chǔ)入門三大核心之JS篇?〗- JavaScript 的「數(shù)組」

    〖大前端 - 基礎(chǔ)入門三大核心之JS篇?〗- JavaScript 的「數(shù)組」

    當(dāng)前子專欄 基礎(chǔ)入門三大核心篇 是免費(fèi)開放階段 。 推薦他人訂閱,可獲取扣除平臺費(fèi)用后的35%收益,文末名片加V! 說明:該文屬于 大前端全棧架構(gòu)白寶書專欄, 目前階段免費(fèi)開放 , 購買任意白寶書體系化專欄可加入 TFS-CLUB 私域社區(qū)。 福利:除了通過訂閱\\\"白寶書系列專

    2024年02月04日
    瀏覽(23)
  • 前端開發(fā)——Javascript知識(介紹)

    目錄 有關(guān)JavaScript的知識? JavaScript的優(yōu)點(diǎn)? ?JavaScript的領(lǐng)域 JavaScript的組成 JavaScript的特點(diǎn) 第一個(gè)JavaScript程序 在 HTML 文檔中嵌入 JavaScript 代碼 在腳本文件中編寫 JavaScript 代碼 JavaScript內(nèi)容? Html內(nèi)容? JavaScript 代碼執(zhí)行順序 JavaScript中的幾個(gè)重要概念 標(biāo)識符 保留字 區(qū)分

    2024年02月01日
    瀏覽(25)
  • 前端開發(fā)——JavaScript的條件語句

    ? 世界不僅有黑,又或者白 世界而是一道精致的灰 ?——Lungcen ? ? 目錄 條件判斷語句 if 語句 if else 語句 if else if else 語句 ?switch語句 break case 子句 default語句 while循環(huán)語句 do while循環(huán)語句 for循環(huán)語句 for 循環(huán)中的三個(gè)表達(dá)式 for 循環(huán)嵌套 for 循環(huán)變體——for in for 循環(huán)

    2023年04月21日
    瀏覽(23)
  • 【前端|Javascript第5篇】全網(wǎng)最詳細(xì)的JS的內(nèi)置對象文章!

    【前端|Javascript第5篇】全網(wǎng)最詳細(xì)的JS的內(nèi)置對象文章!

    前言 在當(dāng)今數(shù)字時(shí)代,前端技術(shù)正日益成為塑造用戶體驗(yàn)的關(guān)鍵。我們在開發(fā)中需要用到很多js的內(nèi)置對象的一些屬性來幫助我們更快速的進(jìn)行開發(fā)?;蛟S你是剛踏入前端領(lǐng)域的小白,或者是希望深入了解內(nèi)置對象的開發(fā)者,不論你的經(jīng)驗(yàn)如何,本篇博客都將給你詳細(xì)的講解

    2024年02月12日
    瀏覽(57)
  • [前端系列第3彈]JS入門教程:從零開始學(xué)習(xí)JavaScript

    本文將帶領(lǐng)大家,從零開始學(xué)習(xí)JavaScript,fighting~ 目錄 一、JavaScript簡介 二、變量和數(shù)據(jù)類型 三、注釋和分號 四、算術(shù)運(yùn)算符 五、表達(dá)式和語句 六、代碼塊和作用域 七、函數(shù)(最重要)? ????????JavaScript(簡稱JS)是一種運(yùn)行在瀏覽器中的腳本語言,它可以讓網(wǎng)頁變得

    2024年02月13日
    瀏覽(95)
  • 快速認(rèn)識,前端必學(xué)編程語言:JavaScript

    快速認(rèn)識,前端必學(xué)編程語言:JavaScript

    JavaScript是構(gòu)建Web應(yīng)用必學(xué)的一門編程語言,也是最受開發(fā)者歡迎的熱門語言之一。所以,如果您還不知道JavaScript的用處、特點(diǎn)的話,趕緊補(bǔ)充一下這塊基礎(chǔ)知識。 JavaScript 是一種高級、單線程、垃圾收集、解釋或即時(shí)編譯、基于原型、多范式、動態(tài)語言,具有非阻塞事件循

    2024年02月05日
    瀏覽(26)
  • 〖大前端 - 基礎(chǔ)入門三大核心之JS篇?〗- JavaScript 的DOM簡介

    〖大前端 - 基礎(chǔ)入門三大核心之JS篇?〗- JavaScript 的DOM簡介

    說明:該文屬于 大前端全棧架構(gòu)白寶書專欄, 目前階段免費(fèi) , 如需要項(xiàng)目實(shí)戰(zhàn)或者是體系化資源,文末名片加V! 作者:不渴望力量的哈士奇(哈哥),十余年工作經(jīng)驗(yàn), 從事過全棧研發(fā)、產(chǎn)品經(jīng)理等工作,目前在公司擔(dān)任研發(fā)部門CTO。 榮譽(yù): 2022年度博客之星Top4、2023年度超

    2024年02月04日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包