摘要:為了更加方便的處理異步操作問(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í)行
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í)行的核心代碼
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
摘要:如果你還沒(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,原型鏈,就能獲得...
摘要:如果你還沒(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,原型鏈,就...
摘要:的翻譯文檔由的維護(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...
摘要:最近讀了的源碼,理清楚了架構(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...
摘要:前言在異步處理方案中,目前最為簡(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)系...
閱讀 718·2023-04-25 17:54
閱讀 2974·2021-11-18 10:02
閱讀 1137·2021-09-28 09:35
閱讀 653·2021-09-22 15:18
閱讀 2854·2021-09-03 10:49
閱讀 3056·2021-08-10 09:42
閱讀 2577·2019-08-29 16:24
閱讀 1260·2019-08-29 15:08