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

【前端面經(jīng)】JS-異步解決方案

這篇具有很好參考價(jià)值的文章主要介紹了【前端面經(jīng)】JS-異步解決方案。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

同步和異步

眾所周知, JavaScript是一門單線程的語(yǔ)言, 單線程就意味著同一時(shí)間只能執(zhí)行一個(gè)任務(wù), 當(dāng)前任務(wù)執(zhí)行結(jié)束, 才會(huì)執(zhí)行下一個(gè)任務(wù). 這種模式的好處就是執(zhí)行環(huán)境比較單純, 但壞處也很明顯, 一旦有某個(gè)任務(wù)卡住了, 就會(huì)導(dǎo)致整個(gè)程序阻塞. 為了解決這個(gè)問(wèn)題, JS將任務(wù)的執(zhí)行模式分成了同步(Synchronous)異步(Asynchronous)兩種.

更詳細(xì)的同步異步的執(zhí)行模式可以參考事件循環(huán)

下面我們就來(lái)講講JS異步編程的幾種解決方案.

1.回調(diào)函數(shù)

回調(diào)函數(shù)是異步編程的最基本的方法, 它通常作為一個(gè)參數(shù)傳遞給另一個(gè)函數(shù), 并且在父函數(shù)執(zhí)行完成后執(zhí)行回調(diào)函數(shù)

例如:

function logB(){
    console.log("b");
}

function parent(a, callback) {
    console.log(a);
    typeof callback === 'function' ? callback() : return
}

parent('a', logB)

在上面的例子中, 在parent函數(shù)中, 如果callback參數(shù)傳入的是一個(gè)函數(shù), 那么在輸出形參a之后就會(huì)執(zhí)行callback函數(shù), 上述例子中l(wèi)ogB就是作為回調(diào)函數(shù)傳入parent中并執(zhí)行

在實(shí)際開(kāi)發(fā)過(guò)程中, 回調(diào)函數(shù)的使用場(chǎng)景還是很多的, 例如常見(jiàn)的數(shù)組遍歷方法forEach, 其第一個(gè)參數(shù)就是回調(diào)函數(shù)

let arr = [1, 2, 3]
arr.forEach((item) => {
    console.log(item);
})

回調(diào)函數(shù)的優(yōu)點(diǎn)是簡(jiǎn)單易懂, 但其實(shí)一旦嵌套起來(lái)很不利于代碼的維護(hù)和可讀性. 而且各個(gè)部分之間高度耦合, 流程會(huì)比較混亂. 最經(jīng)典就是回調(diào)地獄(callback hell).
在實(shí)際開(kāi)發(fā)過(guò)程中, 經(jīng)常能遇到一些業(yè)務(wù)需要先發(fā)送一個(gè)請(qǐng)求獲取數(shù)據(jù)后, 再根據(jù)這個(gè)請(qǐng)求的返回結(jié)果再發(fā)送第二個(gè)請(qǐng)求, 第三個(gè)請(qǐng)求可能又需要第二個(gè)請(qǐng)求的返回結(jié)果作為參數(shù), 如此層層嵌套就稱之為回調(diào)地獄, 這樣的代碼就很難維護(hù).

ajax('url1', (res1) => {
    console.log(res1)
    ajax('url2+res1', (res2) => {
        console.log(res2)
        ajax('url3 + res2', (res) => {
            console.log(res3)
            ...
        })
    })
})

優(yōu)點(diǎn): 簡(jiǎn)單易懂
缺點(diǎn): 多層回調(diào)函數(shù)嵌套時(shí)容易混亂, 不利于代碼維護(hù)和可讀性, 容易寫出回調(diào)地獄

事件監(jiān)聽(tīng)

這種方式, 異步任務(wù)的執(zhí)行不取決于代碼的執(zhí)行順序, 而取決于某個(gè)事件是否發(fā)生.

element.addEventListener('click', ()=> {
    console.log('click')
})

上面這個(gè)例子的含義是, 當(dāng)element被點(diǎn)擊時(shí), 就會(huì)輸出click

  • 優(yōu)點(diǎn): 比較容易理解, 并且可以綁定多個(gè)事件, 每個(gè)事件可以指定多個(gè)回調(diào)函數(shù), 可以比較好的去耦合, 有利于實(shí)現(xiàn)模塊化.
  • 缺點(diǎn): 整個(gè)程序變成了事件驅(qū)動(dòng)型, 運(yùn)行流程很不清晰, 比較難看出主流程, 代碼可讀性低

Promise

Promise是一種處理異步代碼(并且不會(huì)陷入回調(diào)地獄)的方式

Promise代表一個(gè)異步操作, 其有三種狀態(tài)pending(進(jìn)行中)、fulfilled(已完成)、rejected(已失敗), 一個(gè)Promise對(duì)象必然處于這三種狀態(tài)之一

  • pending: 初始狀態(tài), 既沒(méi)有完成, 也沒(méi)有被拒絕
  • fulfilled: 操作成功完成
  • rejected: 操作失敗

當(dāng)Promise被調(diào)用后, 它會(huì)以pending開(kāi)始, 代碼會(huì)繼續(xù)往下執(zhí)行, 而Promise仍處于pending狀態(tài), 直到執(zhí)行完成為止, 最終會(huì)以fulfilledrejected結(jié)束, 并對(duì)應(yīng)的傳給回調(diào)函數(shù)–then或者catch.
優(yōu)點(diǎn): 不僅可以解決回調(diào)地獄問(wèn)題, 而且能夠捕獲錯(cuò)誤并進(jìn)行處理
缺點(diǎn): 無(wú)法取消Promise

Generator

Generator 函數(shù)是 ES6 提供的一種異步編程解決方案,語(yǔ)法行為與傳統(tǒng)函數(shù)完全不同,Generator 最大的特點(diǎn)就是可以控制函數(shù)的執(zhí)行。

語(yǔ)法上,首先可以把它理解成,Generator 函數(shù)是一個(gè)狀態(tài)機(jī),封裝了多個(gè)內(nèi)部狀態(tài)。
Generator 函數(shù)除了狀態(tài)機(jī),還是一個(gè)遍歷器對(duì)象生成函數(shù)。
可暫停函數(shù), yield可暫停,next方法可啟動(dòng),每次返回的是yield后的表達(dá)式結(jié)果。
yield表達(dá)式本身沒(méi)有返回值,或者說(shuō)總是返回undefined。next方法可以帶一個(gè)參數(shù),該參數(shù)就會(huì)被當(dāng)作上一個(gè)yield表達(dá)式的返回值。

async/await

本質(zhì)上async和await是Promise的語(yǔ)法糖, 它可以使得異步代碼看起來(lái)像同步代碼一樣

更加詳細(xì)的Promise可以參考: Promise

總結(jié)

  1. JS 異步編程進(jìn)化史: callbackpromisegeneratorasync/await
  2. async/await 函數(shù)的實(shí)現(xiàn),就是將 Generator 函數(shù)和自動(dòng)執(zhí)行器,包裝在一個(gè)函數(shù)里。
  3. async/await可以說(shuō)是異步終極解決方案了。

(1) async/await函數(shù)相對(duì)于Promise, 優(yōu)勢(shì)體現(xiàn)在:

  • 處理 then 的調(diào)用鏈,能夠更清晰準(zhǔn)確的寫出代碼
  • 并且也能優(yōu)雅地解決回調(diào)地獄問(wèn)題。
    當(dāng)然async/await函數(shù)也存在一些缺點(diǎn):
  • 因?yàn)?await 將異步代碼改造成了同步代碼,如果多個(gè)異步代碼沒(méi)有依賴性卻使用了 await 會(huì)導(dǎo)致性能上的降低,代碼沒(méi)有依賴性的話,完全可以使用 Promise.all 的方式。

(2) async/await函數(shù)對(duì) Generator 函數(shù)的改進(jìn),體現(xiàn)在以下三點(diǎn):

  1. 內(nèi)置執(zhí)行器。

    Generator 函數(shù)的執(zhí)行必須靠執(zhí)行器,所以才有了 co 函數(shù)庫(kù),而 async 函數(shù)自帶執(zhí)行器。也就是說(shuō),async 函數(shù)的執(zhí)行,與普通函數(shù)一模一樣,只要一行。

  2. 更廣的適用性。

    co 函數(shù)庫(kù)約定,yield 命令后面只能是 Thunk 函數(shù)或 Promise 對(duì)象,而 async 函數(shù)的 await 命令后面,可以跟 Promise 對(duì)象和原始類型的值(數(shù)值、字符串和布爾值,但這時(shí)等同于同步操作)。

  3. 更好的語(yǔ)義。

    async 和 await,比起星號(hào)和 yield,語(yǔ)義更清楚了。async 表示函數(shù)里有異步操作,await 表示緊跟在后面的表達(dá)式需要等待結(jié)果。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-433980.html

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

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

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

相關(guān)文章

  • @Async異步線程:Spring 自帶的異步解決方案

    @Async異步線程:Spring 自帶的異步解決方案

    ? ? ? ? 在項(xiàng)目應(yīng)用中,使用MQ異步調(diào)用來(lái)實(shí)現(xiàn)系統(tǒng)性能優(yōu)化,完成服務(wù)間數(shù)據(jù)同步是常用的技術(shù)手段。如果是在同一臺(tái)服務(wù)器內(nèi)部,不涉及到分布式系統(tǒng),單純的想實(shí)現(xiàn)部分業(yè)務(wù)的異步執(zhí)行,這里介紹一個(gè)更簡(jiǎn)單的異步方法調(diào)用。 ????????對(duì)于異步方法調(diào)用,從Spring3 開(kāi)

    2023年04月24日
    瀏覽(24)
  • JavaScript 異步編程解決方案-上篇

    1、JavaScript 異步編程 1、傳統(tǒng)的方案 :JavaScript 中的異步操作函數(shù)往往通過(guò)回調(diào)函數(shù)來(lái)實(shí)現(xiàn)異步任務(wù)的結(jié)果處理 場(chǎng)景:fs 文件操作 數(shù)據(jù)庫(kù)操作 AJAX 定時(shí)器 eg: 1、setTimeout 函數(shù)

    2024年02月01日
    瀏覽(21)
  • JavaScript 異步編程解決方案-中篇

    JavaScript 異步編程解決方案-中篇

    1.Promise 構(gòu)造函數(shù):new Promise(executor) Promise() 只能通過(guò) new 運(yùn)算符來(lái)構(gòu)造。如果嘗試在沒(méi)有使用 new 的情況下調(diào)用它,會(huì)拋出 TypeError 異常。 1.executor 執(zhí)行器函數(shù):(resolve,reject)={} 2.resolve 函數(shù):內(nèi)部定義成功時(shí)候調(diào)用values={} 3.reject 函數(shù):內(nèi)部定義失敗時(shí)候調(diào)用error={} 備注:e

    2024年01月23日
    瀏覽(23)
  • Go異步任務(wù)解決方案 Asynq

    Go異步任務(wù)解決方案 Asynq

    今天為大家介紹一個(gè)Go處理異步任務(wù)的解決方案:Asynq,是一個(gè) Go 庫(kù),用于排隊(duì)任務(wù)并與 worker 異步處理它們。它由Redis提供支持,旨在實(shí)現(xiàn)可擴(kuò)展且易于上手。 Asynq 是一個(gè) Go 庫(kù),用于對(duì)任務(wù)進(jìn)行排隊(duì)并與工作人員異步處理它們。 Asynq 工作原理的高級(jí)概述: 客戶端將任務(wù)放入

    2024年01月17日
    瀏覽(19)
  • 【go】異步任務(wù)解決方案Asynq實(shí)戰(zhàn)

    Asynq 是一個(gè) Go 庫(kù),一個(gè)高效的分布式任務(wù)隊(duì)列。 Asynq 工作原理: 客戶端(生產(chǎn)者)將任務(wù)放入隊(duì)列 服務(wù)器(消費(fèi)者)從隊(duì)列中拉出任務(wù)并為每個(gè)任務(wù)啟動(dòng)一個(gè)工作 goroutine 多個(gè)工作人員同時(shí)處理任務(wù) git庫(kù):https://github.com/hibiken/asynq Asynq 使用 Redis 作為消息代理。client 和 se

    2024年02月10日
    瀏覽(20)
  • JavaScript 異步解決方案 Promise 全解析(轉(zhuǎn)載)

    Promise 是一個(gè) JS 的異步編程解決方案,解決了傳統(tǒng)異步編程回調(diào)地獄的問(wèn)題。 從語(yǔ)義上來(lái)說(shuō): Promise 是一個(gè)向外部傳達(dá)異步編程操作消息的對(duì)象。 JS里一個(gè)promise可以有以下幾種基本狀態(tài): nothing happened yet \\\"locked in\\\" to another promise fulfilled rejected 其中{1,2}為 pending ,{3,4}為 settl

    2024年02月08日
    瀏覽(25)
  • Redux異步解決方案 1. Redux-Thunk中間件

    Redux異步解決方案 1. Redux-Thunk中間件

    簡(jiǎn)單介紹一下 thunk ,這是一個(gè)中間件,是解決 redux 異步問(wèn)題產(chǎn)生的。我們都知道,在使用 redux 的時(shí)候,通過(guò) dispatch 一個(gè) action 發(fā)生到 reducer 然后傳遞給 store 修改狀態(tài) 一系列都是同步的,那如果說(shuō)我 dispatch 一個(gè) action 這個(gè) action 幫我請(qǐng)求一下接口數(shù)據(jù),你發(fā)現(xiàn)接口請(qǐng)求是異步

    2024年02月09日
    瀏覽(29)
  • Microsoft ToDo無(wú)法同步的解決方案

    Microsoft ToDo無(wú)法同步的解決方案

    問(wèn)題:在開(kāi)DAILI的情況下,Microsoft to-do、郵件、日歷等UWP均無(wú)法正常同步。 此文中解釋了原因 link UWP 是微軟在 Windows 10 中引入的新概念,由于所有 UWP 應(yīng)用均運(yùn)行在被稱為 App Container 的虛擬沙箱環(huán)境中,其安全性及純凈度遠(yuǎn)勝于傳統(tǒng)的 EXE 應(yīng)用。但 App Container 機(jī)制同時(shí)也阻止

    2024年02月05日
    瀏覽(40)
  • 主從同步的延遲問(wèn)題、原因及解決方案

    主從同步的延遲問(wèn)題、原因及解決方案 MySQL的主從同步在實(shí)際使用過(guò)程中會(huì)有從庫(kù)延遲的問(wèn)題,那么為什么會(huì)有這種問(wèn)題呢? 如何避免這種問(wèn)題呢? 情況一: 從服務(wù)器配置過(guò)低導(dǎo)致延遲 這類延遲場(chǎng)景的出現(xiàn)往往是主節(jié)點(diǎn)擁有較大規(guī)格的配置,而只讀節(jié)點(diǎn)卻購(gòu)買了一個(gè)最小規(guī)格的

    2024年02月16日
    瀏覽(23)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包