寫(xiě)在前面, 這個(gè)話(huà)題其實(shí)還挺大的, 我自己恐怕力有不逮, 所以只能算是筆記總結(jié), 寫(xiě)的肯定會(huì)有點(diǎn)簡(jiǎn)略. 有錯(cuò)誤實(shí)在太正常了. 希望能多多指教.
這篇文章僅僅是解釋一下現(xiàn)有的異步編程方案不涉及具體原理, 但是我的想法是試試看能不能每個(gè)方案都自己實(shí)現(xiàn)一遍, 所以可能是系列文章也可能就此太監(jiān)了.
回調(diào)函數(shù)想必大家都看過(guò)上面的圖片, 雖然不是js代碼, 甚至不是回調(diào), 但是各位同學(xué)估計(jì)對(duì)callback hell感同身受. 但是事實(shí)上回調(diào)函數(shù)跟異步編程并沒(méi)有必然的聯(lián)系. 回調(diào)只是一種設(shè)計(jì)模式. 同步代碼同樣可以使用回調(diào)只是大部分時(shí)候會(huì)讓人覺(jué)得多此一舉而已.
大家都知道回調(diào)并不是那么優(yōu)雅, 很多時(shí)候代碼可能寫(xiě)成這樣:
asyncJob1(function () { asyncJob2(function () { asyncJob3(function () { // your code }) }) })
雖然問(wèn)題算是解決了吧, 但是代碼看著真是令人頭痛. 玩意邏輯稍微復(fù)雜一點(diǎn)說(shuō)不定真會(huì)出現(xiàn)下面的情況:
大概美軍也是回調(diào)寫(xiě)多了吧2333.
事件驅(qū)動(dòng)大部分gui程序都是采用事件驅(qū)動(dòng), web當(dāng)然也不例外, 最典型的就是dom事件:
div.on("click", function () { // balabala })
這個(gè)幾乎都是跟回調(diào)和事件循環(huán)相關(guān)的, 后面會(huì)詳細(xì)講到的.
Promise根據(jù)promise/A+的規(guī)范:
一個(gè)Promise必須處在其中之一的狀態(tài):pending, fulfilled 或 rejected.
如果是pending狀態(tài),則promise可以轉(zhuǎn)換到fulfilled或rejected狀態(tài)。
如果是fulfilled狀態(tài),則promise不能轉(zhuǎn)換成任何其它狀態(tài)。
如果是rejected狀態(tài),則promise不能轉(zhuǎn)換成任何其它狀態(tài)。
Promise都會(huì)有個(gè)then方法, 制定了fulfilled和rejected兩種請(qǐng)況的回調(diào), 同時(shí)then會(huì)返回一個(gè)Promise對(duì)象, 這就允許我們鏈?zhǔn)秸{(diào)用了:
ajax("xxx").then(res => res).then(res => res)
雖然Promise的方案比回調(diào)已經(jīng)好太多了. 但是不難發(fā)現(xiàn)多個(gè)then其實(shí)未必比回調(diào)好看太多, 只能說(shuō)把回調(diào)鋪平了. 可能Promise并不是最優(yōu)雅的解決方案.
generatorgenerator在各個(gè)語(yǔ)言里都有出現(xiàn), python,c#等, 這里不說(shuō)概念, 只說(shuō)在js里該怎么使用就行, 基本理解就是generator是擁有多個(gè)返回值的函數(shù), 每次調(diào)用next就會(huì)調(diào)用一次返回. 這就是所謂 控制權(quán)移交, 當(dāng)然這樣不足以體現(xiàn)其優(yōu)越性, generator最重要的特性就是分步數(shù)據(jù)傳遞: next的參數(shù)可以作為上次yield的返回值, 其實(shí)直覺(jué)上不是很能理解, 不過(guò)我們這里只要知道有這么個(gè)東西就成, 下面是代碼示例:
var f = function* (x) { var y = yield x + 1 yield y + 1 return y } var t = f(1) var s = t.next() console.log(s) // 2 var p = t.next(4) // 這里的4作為上次yield的返回值 console.log(p) // 5
有這么一個(gè)特性, 那么下面的操作性就很強(qiáng)了, 比如tj的著名的co:
co(function* () { var result = yield Promise.resolve(true); return result; }).then(function (value) { console.log(value); }, function (err) { console.error(err.stack); });
可以說(shuō)寫(xiě)法已經(jīng)很同步了. 當(dāng)然這個(gè)也不是最終的解決方案, 不然為什么koa2要用async/await呢hhh
async/await同樣對(duì)于async/await 我們先不糾結(jié)其原理, 我們只需要知道它是generator和promise二者結(jié)合起來(lái)的語(yǔ)法糖(不過(guò)也真夠甜的)
每個(gè)async必然返回一個(gè)Promise對(duì)象, 所以async會(huì)像瘟疫一個(gè)把你的每個(gè)函數(shù)都變成async函數(shù), 所謂可以async的終將async, 下面是例子:
// Promise的解決方案 function foo () { return ajax("xxx").then(res => res).then(res => res) } async function bar () { try { const response = await ajax("xxx") console.log(response) } catch (e) { throw e } }
是不是優(yōu)雅了太多, 除了一大片async/await, 不過(guò)也算小小的代價(jià).
利用午休時(shí)間碼了出來(lái), 不知道有多少錯(cuò)誤呢hhh
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/90488.html
摘要:前端每周清單專(zhuān)注前端領(lǐng)域內(nèi)容,以對(duì)外文資料的搜集為主,幫助開(kāi)發(fā)者了解一周前端熱點(diǎn)分為新聞熱點(diǎn)開(kāi)發(fā)教程工程實(shí)踐深度閱讀開(kāi)源項(xiàng)目巔峰人生等欄目。背后的故事本文是對(duì)于年之間世界發(fā)生的大事件的詳細(xì)介紹,闡述了從提出到角力到流產(chǎn)的前世今生。 前端每周清單專(zhuān)注前端領(lǐng)域內(nèi)容,以對(duì)外文資料的搜集為主,幫助開(kāi)發(fā)者了解一周前端熱點(diǎn);分為新聞熱點(diǎn)、開(kāi)發(fā)教程、工程實(shí)踐、深度閱讀、開(kāi)源項(xiàng)目、巔峰人生等欄目。歡迎...
摘要:前端日?qǐng)?bào)精選漫談函數(shù)式編程一十年蹤跡的博客前端每周清單的優(yōu)勢(shì)與劣勢(shì)有望超越在嵌入式及物聯(lián)網(wǎng)的應(yīng)用現(xiàn)狀進(jìn)階系列高階組件詳解一前端之路譯如何充分利用控制臺(tái)掘金程序猿升級(jí)攻略眾成翻譯中文譯如何充分利用控制臺(tái)掘金前端從強(qiáng)制開(kāi)啟壓縮探 2017-06-27 前端日?qǐng)?bào) 精選 漫談 JS 函數(shù)式編程(一) - 十年蹤跡的博客前端每周清單: Vue的優(yōu)勢(shì)與劣勢(shì);Node.js有望超越Java;JS在嵌...
摘要:難怪超過(guò)三分之一的開(kāi)發(fā)人員工作需要一些知識(shí)。但是隨著行業(yè)的飽和,初中級(jí)前端就業(yè)形勢(shì)不容樂(lè)觀(guān)。整個(gè)系列的文章大概有篇左右,從我是如何成為一個(gè)前端工程師,到各種前端框架的知識(shí)。 為什么 call 比 apply 快? 這是一個(gè)非常有意思的問(wèn)題。 作者會(huì)在參數(shù)為3個(gè)(包含3)以?xún)?nèi)時(shí),優(yōu)先使用 call 方法進(jìn)行事件的處理。而當(dāng)參數(shù)過(guò)多(多余3個(gè))時(shí),才考慮使用 apply 方法。 這個(gè)的原因...
摘要:難怪超過(guò)三分之一的開(kāi)發(fā)人員工作需要一些知識(shí)。但是隨著行業(yè)的飽和,初中級(jí)前端就業(yè)形勢(shì)不容樂(lè)觀(guān)。整個(gè)系列的文章大概有篇左右,從我是如何成為一個(gè)前端工程師,到各種前端框架的知識(shí)。 為什么 call 比 apply 快? 這是一個(gè)非常有意思的問(wèn)題。 作者會(huì)在參數(shù)為3個(gè)(包含3)以?xún)?nèi)時(shí),優(yōu)先使用 call 方法進(jìn)行事件的處理。而當(dāng)參數(shù)過(guò)多(多余3個(gè))時(shí),才考慮使用 apply 方法。 這個(gè)的原因...
摘要:本文最早為雙十一而作,原標(biāo)題雙大前端工程師讀書(shū)清單,以付費(fèi)的形式發(fā)布在上。發(fā)布完本次預(yù)告后,捕捉到了一個(gè)友善的吐槽讀書(shū)清單也要收費(fèi)。這本書(shū)便從的異步編程講起,幫助我們?cè)O(shè)計(jì)快速響應(yīng)的網(wǎng)絡(luò)應(yīng)用,而非簡(jiǎn)單的頁(yè)面。 本文最早為雙十一而作,原標(biāo)題雙 11 大前端工程師讀書(shū)清單,以付費(fèi)的形式發(fā)布在 GitChat 上。發(fā)布之后在讀者圈群聊中和讀者進(jìn)行了深入的交流,現(xiàn)免費(fèi)分享到這里,不足之處歡迎指教...
閱讀 3323·2023-04-26 00:58
閱讀 1274·2021-09-22 16:04
閱讀 3321·2021-09-02 15:11
閱讀 1566·2019-08-30 15:55
閱讀 2347·2019-08-30 15:55
閱讀 3270·2019-08-23 18:41
閱讀 3468·2019-08-23 18:18
閱讀 2759·2019-08-23 17:53