亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

co.js - 讓異步代碼同步化

lanffy / 2430人閱讀

摘要:前端開發(fā)群是大神所編寫的異步解決方案的庫,用于讓異步的代碼同步化。對于異步代碼來說,回調(diào)函數(shù)是最基礎(chǔ)的方案,帶來的弊端也顯而易見。讓代碼扁平化,而讓代碼同步化。

近期在全力開發(fā)個人網(wǎng)站,并且又沉淀了一些前后端的技術(shù)。近期會頻繁更新。

這篇文章首發(fā)于我的個人網(wǎng)站:聽說 - https://tasaid.com,建議在我的個人網(wǎng)站閱讀,擁有更好的閱讀體驗。

這篇文章與 博客園 和 Segmentfault 共享。

前端開發(fā)QQ群:377786580

co 是 TJ 大神所編寫的 JavaScript 異步解決方案的庫,用于讓異步的代碼 "同步化"。

它構(gòu)建在以下兩個基礎(chǔ)上,這篇文章不會詳細(xì)講解這 2 個知識點:

ES6 - generator

ES6 - Promise

Generator 和 co

首先我們簡單了解下 generator

// 定義一個 generators
function* foo(){
    yield console.log("bar");
    yield console.log("baz");
}

var g = foo();
g.next(); // prints "bar"
g.next(); // prints "baz"

簡單來說,generator 實現(xiàn)了狀態(tài)暫停/函數(shù)暫停 —— 通過 yield 關(guān)鍵字暫停函數(shù),并返回當(dāng)前函數(shù)的狀態(tài)。

co 實現(xiàn)了 generator自動執(zhí)行,我們使用 coPromise 修改上面的代碼:

var co = require("co");

function* foo() {
    yield Promise.resolve(console.log("bar"));
    yield Promise.resolve(console.log("baz"));
}

var co = require("co");
co(foo);

有人可能要說 "我自己寫個循環(huán)執(zhí)行 next 不也可以么? 為什么一個循環(huán)還要依賴一個庫?"

co 有個使用條件:generator 函數(shù)的 yield 命令后面,只能是 Thunk 函數(shù)或 Promise 對象。

正是這個條件,讓 co 強悍無比。

Callback

我們一步一步來看異步,首先使用 回調(diào)函數(shù)/Callback 的方式封裝一個常見的 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 條請求:

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);
    });
}

然后修改請求代碼,扁平化異步代碼:

ajax("foo")
    .then(function (foo) {
        console.log(foo);
        return ajax("bar")
    })
    .then(function (bar) {
        console.log(bar);
    });
co

最后,讓我們見一下 co 的強悍之處吧。我們使用 co.js 來修改請求代碼:

var co = require("co");

co(function* () {
    var foo = yield ajax("foo");
    console.log(foo);

    var bar = yield ajax("bar");
    console.log(bar);
});

最終我們的異步任務(wù),在代碼中同步化了。

對于異步代碼來說,回調(diào)函數(shù)是最基礎(chǔ)的方案,帶來的弊端也顯而易見。Promise 讓代碼扁平化,而 co 讓代碼同步化。

這篇文章首發(fā)于我的個人網(wǎng)站:聽說 - https://tasaid.com,建議在我的個人網(wǎng)站閱讀,擁有更好的閱讀體驗。

這篇文章與 博客園 和 Segmentfault 共享。

前端開發(fā)QQ群:377786580

參考和引用

Promise.js

Github - TJ Holowaychuk - co.js

co 函數(shù)庫的含義和用法

Thunk 函數(shù)的含義和用法

MDN - 迭代器和生成器

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

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/80566.html

相關(guān)文章

  • ES6 Generator與異步同步書寫

    摘要:返回值是一個對象,它的第一個屬性是后面表達(dá)式的值或者的值第二個屬性表示函數(shù)是否執(zhí)行完成。真正的業(yè)務(wù)邏輯確實是用同步的方式寫的。 開始前 我們從來沒有停止過對javascript語言異步調(diào)用方式的改造,我們一直都想用像java那樣同步的方式去寫異步,盡管Promise可以讓我們將異步回調(diào)添加到then方法中,但是這種調(diào)用方式仍然不那么優(yōu)雅,es6 中新增加了generator,我們可以通...

    andycall 評論0 收藏0
  • co源碼分析及其實踐

    摘要:返回的結(jié)果是一個對象,類似于表示本次后面執(zhí)行之后返回的結(jié)果。對象用于一個異步操作的最終完成或失敗及其結(jié)果值的表示簡單點說就是處理異步請求。源碼分析主要脈絡(luò)函數(shù)調(diào)用后,返回一個實例。參考鏈接解釋對象的用法的源碼及其用法 本文始發(fā)于我的個人博客,如需轉(zhuǎn)載請注明出處。為了更好的閱讀體驗,可以直接進(jìn)去我的個人博客看。 前言 知識儲備 閱讀本文需要對Generator和Promise有一個基本的...

    vincent_xyb 評論0 收藏0
  • 對Koa-middleware實現(xiàn)機制的分析

    摘要:現(xiàn)在我們從實現(xiàn)一個簡易的方法開始探索其中的機制。其中內(nèi)部的可以將上一個的返回值傳遞給外部。一言以蔽之實現(xiàn)了遞歸調(diào)用的方法。當(dāng)執(zhí)行到的中間件沒有時并且返回的為時逆序執(zhí)行。 本文發(fā)布在github.com/ssssyoki,歡迎star,issues共同交流。 Koa是基于Node.js的下一代web開發(fā)框架,相比Express更輕,源碼只有幾百行。與傳統(tǒng)的中間件不同,在Koa 1.x中采...

    MageekChiu 評論0 收藏0
  • 深入探析koa之異步回調(diào)處理篇

    摘要:而之后,我們得到的是一個是一個對象,我們可以使用語句定義回調(diào)函數(shù),函數(shù)的內(nèi)容呢,則是將讀取到的返回給并繼續(xù)讓從斷點處執(zhí)行。 在上一篇中我們梳理了koa當(dāng)中中間件的洋蔥模型執(zhí)行原理,并實現(xiàn)了一個可以讓洋蔥模型自動跑起來的流程管理函數(shù)。這一篇,我們再來研究一下koa當(dāng)中異步回調(diào)同步化寫法的原理,同樣的,我們也會實現(xiàn)一個管理函數(shù),是的我們能夠通過同步化的寫法來寫異步回調(diào)函數(shù)。 1. 回調(diào)金字...

    Drinkey 評論0 收藏0
  • dubbo源碼解析(四十八)異步改造

    摘要:大揭秘異步化改造目標(biāo)從源碼的角度分析的新特性中對于異步化的改造原理??丛创a解析四十六消費端發(fā)送請求過程講到的十四的,在以前的邏輯會直接在方法中根據(jù)配置區(qū)分同步異步單向調(diào)用。改為關(guān)于可以參考源碼解析十遠(yuǎn)程通信層的六。 2.7大揭秘——異步化改造 目標(biāo):從源碼的角度分析2.7的新特性中對于異步化的改造原理。 前言 dubbo中提供了很多類型的協(xié)議,關(guān)于協(xié)議的系列可以查看下面的文章: du...

    lijinke666 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<