摘要:前端開發(fā)群是大神所編寫的異步解決方案的庫(kù),用于讓異步的代碼同步化。對(duì)于異步代碼來說,回調(diào)函數(shù)是最基礎(chǔ)的方案,帶來的弊端也顯而易見。讓代碼扁平化,而讓代碼同步化。
近期在全力開發(fā)個(gè)人網(wǎng)站,并且又沉淀了一些前后端的技術(shù)。近期會(huì)頻繁更新。
這篇文章首發(fā)于我的個(gè)人網(wǎng)站:聽說 - https://tasaid.com,建議在我的個(gè)人網(wǎng)站閱讀,擁有更好的閱讀體驗(yàn)。
這篇文章與 博客園 和 Segmentfault 共享。
前端開發(fā)QQ群:377786580
co 是 TJ 大神所編寫的 JavaScript 異步解決方案的庫(kù),用于讓異步的代碼 "同步化"。
它構(gòu)建在以下兩個(gè)基礎(chǔ)上,這篇文章不會(huì)詳細(xì)講解這 2 個(gè)知識(shí)點(diǎn):
ES6 - generator
ES6 - Promise
Generator 和 co首先我們簡(jiǎn)單了解下 generator:
// 定義一個(gè) generators function* foo(){ yield console.log("bar"); yield console.log("baz"); } var g = foo(); g.next(); // prints "bar" g.next(); // prints "baz"
簡(jiǎn)單來說,generator 實(shí)現(xiàn)了狀態(tài)暫停/函數(shù)暫停 —— 通過 yield 關(guān)鍵字暫停函數(shù),并返回當(dāng)前函數(shù)的狀態(tài)。
co 實(shí)現(xiàn)了 generator 的 自動(dòng)執(zhí)行,我們使用 co 和 Promise 修改上面的代碼:
var co = require("co"); function* foo() { yield Promise.resolve(console.log("bar")); yield Promise.resolve(console.log("baz")); } var co = require("co"); co(foo);
有人可能要說 "我自己寫個(gè)循環(huán)執(zhí)行 next 不也可以么? 為什么一個(gè)循環(huán)還要依賴一個(gè)庫(kù)?"
co 有個(gè)使用條件:generator 函數(shù)的 yield 命令后面,只能是 Thunk 函數(shù)或 Promise 對(duì)象。
正是這個(gè)條件,讓 co 強(qiáng)悍無比。
Callback我們一步一步來看異步,首先使用 回調(diào)函數(shù)/Callback 的方式封裝一個(gè)常見的 ajax 異步任務(wù):
function ajax(q, callback) { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status == 200) { callback(xhr.responseText); } } xhr.open("GET", "query?q=" + q); }
我們使用 回調(diào)函數(shù) 的方式連續(xù)發(fā) 2 條請(qǐng)求:
ajax("foo", function (foo) { console.log(foo); ajax("bar", function (bar) { console.log(bar); }); });
這是 js 中最典型的異步處理方案。
Promise再使用 Promise 封裝異步 ajax,讓回調(diào)函數(shù)扁平化:
function ajax(q, callback) { // 使用 Promise 封裝 return new Promise(function (resolve) { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status == 200) { resolve(xhr.responseText); } } xhr.open("GET", "query?q=" + q); }); }
然后修改請(qǐng)求代碼,扁平化異步代碼:
ajax("foo") .then(function (foo) { console.log(foo); return ajax("bar") }) .then(function (bar) { console.log(bar); });co
最后,讓我們見一下 co 的強(qiáng)悍之處吧。我們使用 co.js 來修改請(qǐng)求代碼:
var co = require("co"); co(function* () { var foo = yield ajax("foo"); console.log(foo); var bar = yield ajax("bar"); console.log(bar); });
最終我們的異步任務(wù),在代碼中同步化了。
對(duì)于異步代碼來說,回調(diào)函數(shù)是最基礎(chǔ)的方案,帶來的弊端也顯而易見。Promise 讓代碼扁平化,而 co 讓代碼同步化。
這篇文章首發(fā)于我的個(gè)人網(wǎng)站:聽說 - https://tasaid.com,建議在我的個(gè)人網(wǎng)站閱讀,擁有更好的閱讀體驗(yàn)。
這篇文章與 博客園 和 Segmentfault 共享。
參考和引用前端開發(fā)QQ群:377786580
Promise.js
Github - TJ Holowaychuk - co.js
co 函數(shù)庫(kù)的含義和用法
Thunk 函數(shù)的含義和用法
MDN - 迭代器和生成器
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/80566.html
摘要:返回值是一個(gè)對(duì)象,它的第一個(gè)屬性是后面表達(dá)式的值或者的值第二個(gè)屬性表示函數(shù)是否執(zhí)行完成。真正的業(yè)務(wù)邏輯確實(shí)是用同步的方式寫的。 開始前 我們從來沒有停止過對(duì)javascript語言異步調(diào)用方式的改造,我們一直都想用像java那樣同步的方式去寫異步,盡管Promise可以讓我們將異步回調(diào)添加到then方法中,但是這種調(diào)用方式仍然不那么優(yōu)雅,es6 中新增加了generator,我們可以通...
摘要:返回的結(jié)果是一個(gè)對(duì)象,類似于表示本次后面執(zhí)行之后返回的結(jié)果。對(duì)象用于一個(gè)異步操作的最終完成或失敗及其結(jié)果值的表示簡(jiǎn)單點(diǎn)說就是處理異步請(qǐng)求。源碼分析主要脈絡(luò)函數(shù)調(diào)用后,返回一個(gè)實(shí)例。參考鏈接解釋對(duì)象的用法的源碼及其用法 本文始發(fā)于我的個(gè)人博客,如需轉(zhuǎn)載請(qǐng)注明出處。為了更好的閱讀體驗(yàn),可以直接進(jìn)去我的個(gè)人博客看。 前言 知識(shí)儲(chǔ)備 閱讀本文需要對(duì)Generator和Promise有一個(gè)基本的...
摘要:現(xiàn)在我們從實(shí)現(xiàn)一個(gè)簡(jiǎn)易的方法開始探索其中的機(jī)制。其中內(nèi)部的可以將上一個(gè)的返回值傳遞給外部。一言以蔽之實(shí)現(xiàn)了遞歸調(diào)用的方法。當(dāng)執(zhí)行到的中間件沒有時(shí)并且返回的為時(shí)逆序執(zhí)行。 本文發(fā)布在github.com/ssssyoki,歡迎star,issues共同交流。 Koa是基于Node.js的下一代web開發(fā)框架,相比Express更輕,源碼只有幾百行。與傳統(tǒng)的中間件不同,在Koa 1.x中采...
摘要:而之后,我們得到的是一個(gè)是一個(gè)對(duì)象,我們可以使用語句定義回調(diào)函數(shù),函數(shù)的內(nèi)容呢,則是將讀取到的返回給并繼續(xù)讓從斷點(diǎn)處執(zhí)行。 在上一篇中我們梳理了koa當(dāng)中中間件的洋蔥模型執(zhí)行原理,并實(shí)現(xiàn)了一個(gè)可以讓洋蔥模型自動(dòng)跑起來的流程管理函數(shù)。這一篇,我們?cè)賮硌芯恳幌耴oa當(dāng)中異步回調(diào)同步化寫法的原理,同樣的,我們也會(huì)實(shí)現(xiàn)一個(gè)管理函數(shù),是的我們能夠通過同步化的寫法來寫異步回調(diào)函數(shù)。 1. 回調(diào)金字...
摘要:大揭秘異步化改造目標(biāo)從源碼的角度分析的新特性中對(duì)于異步化的改造原理??丛创a解析四十六消費(fèi)端發(fā)送請(qǐng)求過程講到的十四的,在以前的邏輯會(huì)直接在方法中根據(jù)配置區(qū)分同步異步單向調(diào)用。改為關(guān)于可以參考源碼解析十遠(yuǎn)程通信層的六。 2.7大揭秘——異步化改造 目標(biāo):從源碼的角度分析2.7的新特性中對(duì)于異步化的改造原理。 前言 dubbo中提供了很多類型的協(xié)議,關(guān)于協(xié)議的系列可以查看下面的文章: du...
閱讀 3031·2021-11-22 12:06
閱讀 612·2021-09-03 10:29
閱讀 6575·2021-09-02 09:52
閱讀 2027·2019-08-30 15:52
閱讀 3423·2019-08-29 16:39
閱讀 1198·2019-08-29 15:35
閱讀 2072·2019-08-29 15:17
閱讀 1433·2019-08-29 11:17