国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

簡(jiǎn)單理解Generator自執(zhí)行及async、await語(yǔ)法原理

stackfing / 911人閱讀

摘要:為了更加方便的處理異步操作問(wèn)題,現(xiàn)在最新的前端框架生態(tài)都開(kāi)始用上了和,有的甚至已經(jīng)開(kāi)始使用最新的語(yǔ)法了,這兩樣都是基于自動(dòng)執(zhí)行的原理。這里就簡(jiǎn)單理解下自執(zhí)行及語(yǔ)法原理一函數(shù)函數(shù)指的是能將執(zhí)行結(jié)果傳入回調(diào)函數(shù),并將該回調(diào)函數(shù)返回的函數(shù)。

為了更加方便的處理異步操作問(wèn)題,
現(xiàn)在最新的前端框架生態(tài)都開(kāi)始用上了Generator和yield,
有的甚至已經(jīng)開(kāi)始使用最新的async、await語(yǔ)法了,
這兩樣都是基于Generator自動(dòng)執(zhí)行的原理。

這里就簡(jiǎn)單理解下Generator自執(zhí)行及async、await語(yǔ)法原理:

一、thunk函數(shù)

thunk函數(shù)指的是能將執(zhí)行結(jié)果傳入回調(diào)函數(shù),并將該回調(diào)函數(shù)返回的函數(shù)。
是不是有點(diǎn)抽象,舉個(gè)例子:

var readFile = function (fileName) {
    return function (callback) {
        return fs.readFile(fileName, callback)
    }
}

下面我們來(lái)看下thunk函數(shù)怎樣執(zhí)行

readFile("./package.json")((err, str) => {
    console.log(str.toString())
})

問(wèn): thunk的執(zhí)行比普通函數(shù)要麻煩不少,那么它有什么優(yōu)勢(shì)呢?

thunk函數(shù)的優(yōu)勢(shì)在于它能將異步操作返回結(jié)果的獲取權(quán)交給thunk函數(shù)的返回值,
而不是將異步操作結(jié)果傳入thunk函數(shù)本身的作用域內(nèi),這點(diǎn)很重要,
因?yàn)樗芙Y(jié)合Generator語(yǔ)法讓Generator函數(shù)自動(dòng)執(zhí)行

二、Generator

es6的Generator函數(shù),具體語(yǔ)法這里就不介紹了,

我們來(lái)編寫(xiě)一個(gè)基于thunk函數(shù)的Generator:

let gen = function* () {
    let r1 = yield readFile("./package.json")
    console.log(r1.toString())
    let r2 = yield readFile("./index.js")
    console.log(r2.toString())
}

我們來(lái)手動(dòng)執(zhí)行一下這個(gè)Generator:

let g = gen()
let r1 = g.next()
r1.value(function (err, data) {
    if (err) {
        throw err
    }
    let r2 = g.next(data)
    r2.value(function (err, data) {
        if (err) {
            throw err
        }
        g.next(data)
    })
})

可以注意到,在我們手動(dòng)執(zhí)行基于thunk函數(shù)的Generator時(shí),
有很多代碼是可以復(fù)用的,
沒(méi)錯(cuò),所謂的Generator自動(dòng)執(zhí)行就是把這些可復(fù)用的部分封裝成函數(shù),
然后讓它們遞歸執(zhí)行,直到執(zhí)行完所有的yield。

三、Generator自動(dòng)執(zhí)行器

下面就是Generator自動(dòng)執(zhí)行的核心代碼

function run(fn) {
    let gen = fn()
    function next(err, data) {
        let result = gen.next(data)
        if (result.done) {
            return
        }
        result.value(next)
    }
    next()
}

可以看到無(wú)非就是把可復(fù)用的部分封裝成next函數(shù),然后讓其遞歸執(zhí)行,
直到執(zhí)行完所有的yield

其調(diào)用代碼為:

run(gen)

這樣就將原本繁雜的異步操作封裝的十分簡(jiǎn)單了

基于Promise的Generator的自動(dòng)執(zhí)行

上面的例子是基于thunk函數(shù)的,而即將出現(xiàn)的es7的async、await語(yǔ)法是基于Promise的

這里再上一個(gè)基于Promise的Generator的自動(dòng)執(zhí)行

//包裝返回Promise對(duì)象的函數(shù)
function readFile(fileName) {
    return new Promise((resolve, reject) => {
        fs.readFile(fileName, (error, data) => {
            if (error) {
                reject(error)
            } else {
                resolve(data)
            }
        })
    })
}

// 編寫(xiě)Generator
let gen = function* () {
    let r1 = yield readFile("./package.json")
    console.log(r1.toString())
    let r2 = yield readFile("./index.js")
    console.log(r2.toString())
}

// 編寫(xiě)Generator執(zhí)行器
function run(gen) {
    let g = gen()
    function next(data) {
        let result = g.next(data)
        if (result.done) {
            return result.value
        }
        result.value.then((data) => next(data))
    }
    next()
}

//用Generator執(zhí)行器自動(dòng)執(zhí)行
run(gen)

這個(gè)和基于thunk函數(shù)的大同小異,只是把函數(shù)返回值的獲取權(quán)以Promise的方式交出

希望這篇文章能幫助你簡(jiǎn)單的理解Generator自執(zhí)行及async、await語(yǔ)法原理 ^.^

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/81408.html

相關(guān)文章

  • 【面試篇】寒冬求職季之你必須要懂的原生JS(中)

    摘要:如果你還沒(méi)讀過(guò)上篇上篇和中篇并無(wú)依賴(lài)關(guān)系,您可以讀過(guò)本文之后再閱讀上篇,可戳面試篇寒冬求職季之你必須要懂的原生上小姐姐花了近百個(gè)小時(shí)才完成這篇文章,篇幅較長(zhǎng),希望大家閱讀時(shí)多花點(diǎn)耐心,力求真正的掌握相關(guān)知識(shí)點(diǎn)。 互聯(lián)網(wǎng)寒冬之際,各大公司都縮減了HC,甚至是采取了裁員措施,在這樣的大環(huán)境之下,想要獲得一份更好的工作,必然需要付出更多的努力。 一年前,也許你搞清楚閉包,this,原型鏈,就能獲得...

    andycall 評(píng)論0 收藏0
  • 【面試篇】寒冬求職季之你必須要懂的原生JS(中)

    摘要:如果你還沒(méi)讀過(guò)上篇上篇和中篇并無(wú)依賴(lài)關(guān)系,您可以讀過(guò)本文之后再閱讀上篇,可戳面試篇寒冬求職季之你必須要懂的原生上小姐姐花了近百個(gè)小時(shí)才完成這篇文章,篇幅較長(zhǎng),希望大家閱讀時(shí)多花點(diǎn)耐心,力求真正的掌握相關(guān)知識(shí)點(diǎn)。 互聯(lián)網(wǎng)寒冬之際,各大公司都縮減了HC,甚至是采取了裁員措施,在這樣的大環(huán)境之下,想要獲得一份更好的工作,必然需要付出更多的努力。 一年前,也許你搞清楚閉包,this,原型鏈,就...

    Mike617 評(píng)論0 收藏0
  • ES6-7

    摘要:的翻譯文檔由的維護(hù)很多人說(shuō),阮老師已經(jīng)有一本關(guān)于的書(shū)了入門(mén),覺(jué)得看看這本書(shū)就足夠了。前端的異步解決方案之和異步編程模式在前端開(kāi)發(fā)過(guò)程中,顯得越來(lái)越重要。為了讓編程更美好,我們就需要引入來(lái)降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(shū)(中文版) 超詳細(xì)介紹promise的gitbook,看完再不會(huì)promise...... 本書(shū)的目的是以目前還在制定中的ECMASc...

    mudiyouyou 評(píng)論0 收藏0
  • 深入koa源碼(二):核心庫(kù)原理

    摘要:最近讀了的源碼,理清楚了架構(gòu)設(shè)計(jì)與用到的第三方庫(kù)。本系列將分為篇,分別介紹的架構(gòu)設(shè)計(jì)和個(gè)核心庫(kù),最終會(huì)手動(dòng)實(shí)現(xiàn)一個(gè)簡(jiǎn)易的。本文來(lái)自心譚博客深入源碼核心庫(kù)原理所有系列文章都放在了。這一段邏輯封裝在了核心庫(kù)里面。 最近讀了 koa2 的源碼,理清楚了架構(gòu)設(shè)計(jì)與用到的第三方庫(kù)。本系列將分為 3 篇,分別介紹 koa 的架構(gòu)設(shè)計(jì)和 3 個(gè)核心庫(kù),最終會(huì)手動(dòng)實(shí)現(xiàn)一個(gè)簡(jiǎn)易的 koa。這是系列第 2...

    tyheist 評(píng)論0 收藏0
  • Async:簡(jiǎn)潔優(yōu)雅的異步之道

    摘要:前言在異步處理方案中,目前最為簡(jiǎn)潔優(yōu)雅的便是函數(shù)以下簡(jiǎn)稱(chēng)函數(shù)。聲明式表達(dá)式作為對(duì)象屬性作為對(duì)象屬性的簡(jiǎn)寫(xiě)式箭頭函數(shù)返回值執(zhí)行函數(shù),會(huì)固定的返回一個(gè)對(duì)象。如果該對(duì)象最終成功,則會(huì)返回成功的返回值,相當(dāng)將替換成返回值。 前言 在異步處理方案中,目前最為簡(jiǎn)潔優(yōu)雅的便是async函數(shù)(以下簡(jiǎn)稱(chēng)A函數(shù))。經(jīng)過(guò)必要的分塊包裝后,A函數(shù)能使多個(gè)相關(guān)的異步操作如同同步操作一樣聚合起來(lái),使其相互間的關(guān)系...

    leiyi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<