深入淺出nodejs學習筆記--第四章 異步編程


這一章的知識跨度看起來不廣,但是知識深度的還是挺深的,異步編程作爲nodejs的核心,個人同時需要一定的深度纔可以去理解。

在這一章提到了函數式編程和異步編程解決方案的兩個知識點,首先來了解一下函數式編程


函數式編程

這裏先放一本書,https://www.gitbook.com/book/llh911001/mostly-adequate-guide-chinese/details 覺得講得不錯,因爲越到後面越看不懂

JavaScript其實之前是一直被誤解的,因爲它一直被當做是命令式式的編程語言,或許js爸爸Brendan Eich一開始設計的時候也是這樣想的,但是其實js也是可以做函數式的編程。所謂函數式編程,其實不難,不同於後臺強類型語言的面向對象式的編程語言,函數式編程是種編程範式,它將電腦運算視爲函數的計算,強調計算。

函數式編程有以下特點:支持閉包和高階函數,支持惰性計算(lazy evaluation)。使用遞歸作爲控制流程的機制。加強了引用透明性。沒有副作用。(這句話是百度的)

這本書主要介紹了函數式編程的一些規範,我只拿其中的簡單幾個概念作爲例子

高階函數: 高階函數是可以把函數作爲參數(如傳遞一個方法作爲參數),或者說是可以把函數作爲返回值的函數(其實就是return一個函數)

偏函數: 偏函數是指通過部分參數來產生一個新的定製的函數的方式,這種就叫做偏函數

純函數: 書中的定義是這樣的,純函數是這樣一種函數,即相同的輸入,永遠會得到相同的輸出,而且沒有任何可觀察的副作用。其實最重要的就是這句話,相同的輸入總會的得到相同的輸出,純函數的純就在這一點,不過多的對函數之外的環境產生依賴,保證函數本身的純粹,從而達到純的目的

函數柯里化:curry無法口述,用一個例子來解釋

var add = function(x) {
    return function(y) {
        return x + y;
    };
};
var increment = add(1);
var addTen = add(10);
increment(2);
// 3
addTen(2); 

這裏我們定義了一個 add 函數,它接受一個參數並返回一個新的函數。調用add 之後,返回的函數就通過閉包的方式記住了 add 的第一個參數。一次性地調用它實在是有點繁瑣,好在我們可以使用一個特殊的 curry 幫助函數(helperfunction)使這類函數的定義和調用更加容易。


異步編程

異步編程的優勢和難點

node的異步編程所帶來的最大優勢就是基於事件驅動的非阻塞IO模型。非阻塞IO可以是CPU和IO操作並不相互依賴等待,讓資源得以更好地利用。對於一些網絡應用而言,並行還可以帶來的優勢是分佈式和雲。

但同時,node所帶來的難點還是很困難的:

難點1: 異常處理 異步中的異常都是這個尿性,看下jquery的ajax就知道,所以在編寫異步方法時,需要將異常正確的返回給用戶的回調方法

難點2: 函數嵌套過深 回調地獄,不解釋,但是現在有Promise,接下來會說

難點3: 阻塞代碼 單線程的缺點,謹慎處理

難點4: 多線程編程 還是單線程所帶來的問題,不過node有自己child_process

難點5: 異步轉同步
這個就是node用慣了異步,但是沒有同步操作的API,所以可能在實現同步的時候要去借助第三方庫,不過放心,npm上面的插件肯定很多


異步編程的解決方案

關於異步編程的解決方案,書中給出了四種,分別是事件發佈/訂閱模式、Promise/Deferred、流程控制庫、異步併發控制

事件發佈/訂閱模式: 這個就是設計模式中的一個概念,node中的event模塊其實是一個很好地實踐

Promise/Deferred: 強調事件的狀態和目標,根據狀態來執行,從而避免深度嵌套,這個es6中的Promise也已經有了很好地實現

流程控制庫:流程控制的一個重要的概念就是尾觸發,es6對這個有個比較好的實現,那就是終止函數,在es7的草案中,更是直接使用了await作爲流程控制中止函數標識

異步併發控制: 考慮到異步操作對內存的影響,爲避免cpu掛掉,所以要對異步的併發進行控制

擴展:

既然說到了流程控制,就不得不說現在最流行的兩個前端框架,Expresskoa

Express是一個老牌的web應用框架了,Express 是一個基於 Node.js 平臺的極簡、靈活的 web 應用開發框架,它提供一系列強大的特性,幫助你創建各種 Web 和移動設備應用。
具體移步官網看,官網:http://www.expressjs.com.cn/

koa是新一種的前端框架,koa 是由 Express 原班人馬打造的,致力於成爲一個更小、更富有表現力、更健壯的 Web 框架。使用 koa 編寫 web 應用,通過組合不同的 generator,可以免除重複繁瑣的回調函數嵌套,並極大地提升錯誤處理的效率。koa 不在內核方法中綁定任何中間件,它僅僅提供了一個輕量優雅的函數庫,使得編寫 Web 應用變得得心應手。koa低層的實現依賴TJ大神的CO,庫很小巧,暫時不深入,具體移步官網,官網:http://koa.bootcss.com/


前端新手,弱雞一枚,如有錯誤,請指正,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章