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