前端學(xué)習(xí)總結(jié)一: Js 異步進(jìn)階

一、Promise

  1. 異步操作便瑟,解決 callback hell 問題

  2. 三種狀態(tài): pending, resolved, rejected
    狀態(tài)的表現(xiàn)和變化康聂,pending ->resolved pending ->rejected,變化不可逆

  3. then 正常狀態(tài)返回 resolved 辑鲤,有報(bào)錯(cuò)則返回 rejected
    catch 正常狀態(tài)返回 resolved 纹因,有報(bào)錯(cuò)則返回 rejected

二喷屋、 async 和 await

  1. 同步語法,消滅異步回調(diào)函數(shù)瞭恰,async/await只是一個(gè)語法糖
    await 函數(shù)后面的都屬于回調(diào)

  2. async/await 與 promise 的關(guān)系

    • 執(zhí)行async 函數(shù)屯曹,返回的是 promise 對(duì)象
    • await 相當(dāng)于 promise 的 then
    • try...catch 可以捕獲異常,代替了 promise 的 catch
async function fn(){
    return 100
}

(async function(){
    const a = fn    // 返回上面的函數(shù)
    const b = await fn()  // 返回 100
})()

三惊畏、event loop

image.png

借用雙越老師的一張圖具體講解恶耽,先來一個(gè)簡單版的:

  • 將第一行代碼 console.log('Hi') 放入Call Stack(調(diào)用棧)
  • 執(zhí)行,瀏覽器打印出 Hi
  • 清空 Call Stack
  • 將setTimeout 方法放入 Call Stack颜启,執(zhí)行發(fā)現(xiàn)這個(gè)是個(gè)異步函數(shù)偷俭,先推入 web API 清空 Call Stack
  • 將最后一行代碼 console.log('Bye') 推入 Call Stack ,執(zhí)行缰盏,打印出 Bye涌萤,清空 Call Stack
  • 此時(shí)所有同步代碼執(zhí)行完畢
  • Event Loop 開始啟動(dòng),輪詢查找 Callback Queue里是否有可執(zhí)行的語句
  • 時(shí)機(jī)到(定時(shí)乳规,網(wǎng)絡(luò)請(qǐng)求形葬,用戶操作等)合呐,將里面可以執(zhí)行的代碼推入 Callback Queue
  • Event Loop 查到有可執(zhí)行語句暮的,將此語句推入 Call Stack ,執(zhí)行淌实,打印出 cb1冻辩,清空 Call Stack
  • Event Loop 繼續(xù)輪詢查找(永動(dòng)機(jī))

四、宏任務(wù)和微任務(wù)

宏任務(wù):setTimeout拆祈, setInterval恨闪, Ajax,DOM 事件
微任務(wù):promise放坏,async/await

微任務(wù)比宏任務(wù)執(zhí)行時(shí)機(jī)要早

image.png

依然是雙越老師的圖咙咽,我們?cè)僦v一次升級(jí)版的瀏覽器執(zhí)行方式:

  • 首先依然是按照代碼順序,將代碼推入 Call Stack
  • 同步代碼淤年,執(zhí)行钧敞,清空 Call Stack
  • Call Stack 中發(fā)現(xiàn)代碼是 promise 或者 async/await 代碼蜡豹,執(zhí)行,將回調(diào)代碼放入micro task queue
  • Call Stack 中發(fā)現(xiàn)代碼是 setTimeout 或者 DOM 操作等等溉苛,執(zhí)行镜廉,將回調(diào)代碼放入 web APIs
  • 此時(shí)同步代碼執(zhí)行完畢
  • Event Loop 開始啟動(dòng)
  • 開始執(zhí)行微任務(wù),將 micro task queue 的代碼推入 callback queue愚战,觸發(fā) Event Loop 將此代碼推入 Call Stack 娇唯,執(zhí)行,清空
  • 微任務(wù)執(zhí)行完畢
  • 嘗試 DOM 渲染
  • 執(zhí)行宏任務(wù)寂玲,時(shí)機(jī)到時(shí)塔插,將 Web APIs 里的代碼推入 callback queue,觸發(fā) Event Loop 將此代碼推入 Call Stack 拓哟,執(zhí)行佑淀,清空
  • Event Loop 繼續(xù)輪詢查找(永動(dòng)機(jī))
宏任務(wù)和微任務(wù)的區(qū)別
  • 宏任務(wù): DOM 渲染后觸發(fā),由 ES6 語法規(guī)定(執(zhí)行前推入micro task queue)
  • 微任務(wù): DOM 渲染前觸發(fā)彰檬,由瀏覽器規(guī)定的(執(zhí)行前推入 Web APIs棧中)

四伸刃、for of

一個(gè)異步遍歷方法,話不多說逢倍,直接貼代碼

// for of
function muti(num) {
    const a = new Promise(resolve => {
        setTimeout(() => {
            resolve(num * num)
        }, 1000)
    })
    return a;
}

let arr = [2, 4, 6]
!(async function(){
    for(let i of arr) {
        const res = await muti(i)
        console.log(res)
    }
})()

手寫一個(gè) ajax 方法

// 手寫一個(gè) ajax 方法
function ajax(url){
    const p = new Promise((resolve,reject) => {
        const xhr = new XMLHttpRequest();
        xhr.open('GET',url,true)
        xhr.onreadystatechange = function () {
            if(xhr.readyState === 4) {
                if(xhr.status === 200) {
                    console.log(xhr);
                    resolve(JSON.parse(xhr.response))
                } else {
                    reject(new Error('404 not found'))
                }
            }
        }
        xhr.send(null)
    })
    
    return p
}

// 試一下
const url = 'http://demo.mall.10010.com:8104/scaffold-app/scaffold/queryPagealiasProData?page_alias=two-in-one'
ajax(url).then((res) => {
    console.log(res);
}).catch(err => console.log(err))


手寫深度比較

// 手寫深度比較 
function isObject(obj) {
    return typeof obj === 'object' && obj != null
}

function isEqual (obj1, obj2) {
    if(!isObject(obj1) || !isObject(obj2)) {
         return  obj1 === obj2
    }
    if (obj1 === obj2) {
        return true;
    }
    const obj1Key = Object.keys(obj1)
    const obj2Key = Object.keys(obj2)
    if (obj1Key.length != obj2Key.length) {
        return false
    }
    for(let key in obj1) {
        const res = isEqual(obj1[key], obj2[key])
        if(!res){
            return false
        }
    }
    return true
}

jsonp 原理(不是真正的 ajax)

幾個(gè)方面來解答:

  • 瀏覽器同源策略和跨域
  • 哪些 html 標(biāo)簽可以繞過跨域(Image script)
  • 利用 script 封裝成 jsonp
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捧颅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子较雕,更是在濱河造成了極大的恐慌碉哑,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亮蒋,死亡現(xiàn)場(chǎng)離奇詭異扣典,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)慎玖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門贮尖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人趁怔,你說我怎么就攤上這事湿硝。” “怎么了润努?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵关斜,是天一觀的道長。 經(jīng)常有香客問我铺浇,道長痢畜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮丁稀,結(jié)果婚禮上繁涂,老公的妹妹穿的比我還像新娘。我一直安慰自己二驰,他們只是感情好扔罪,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著桶雀,像睡著了一般矿酵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上矗积,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天全肮,我揣著相機(jī)與錄音,去河邊找鬼棘捣。 笑死辜腺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的乍恐。 我是一名探鬼主播评疗,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼茵烈!你這毒婦竟也來了百匆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤呜投,失蹤者是張志新(化名)和其女友劉穎加匈,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仑荐,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雕拼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了粘招。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啥寇。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖男图,靈堂內(nèi)的尸體忽然破棺而出示姿,到底是詐尸還是另有隱情甜橱,我是刑警寧澤逊笆,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站岂傲,受9級(jí)特大地震影響难裆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一乃戈、第九天 我趴在偏房一處隱蔽的房頂上張望褂痰。 院中可真熱鬧,春花似錦症虑、人聲如沸缩歪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匪蝙。三九已至,卻和暖如春习贫,著一層夾襖步出監(jiān)牢的瞬間逛球,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來泰國打工苫昌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颤绕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓祟身,卻偏偏與公主長得像奥务,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子袜硫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容