本文經過簡單易懂的方式(例子+概念)講解了如下幾個http進階概念,同時聯繫node.js,講解了node.js中的HTTP原理。你們在看這篇文章以前,但願先確保瞭解了此文羅列的概念。前端
由於本文只是用最簡單的Node來說解,因此也適用於非Node學習者。node
你打飯店電話問老闆有沒有位子,老闆說他去看一下,而後就掛了電話,你去作別的事情,老闆找了很久找到了位子,而後再從新撥通你的電話告訴你。老闆找到位子後回撥電話這個動做叫作回調。編程
回調函數就是某個函數執行完畢後執行的函數。segmentfault
//回調函數爲具名函數 function learn(something) { console.log(something); } function we(callback, something) { something += ' is cool'; callback(something); } we(learn, 'Nodejs'); //回調函數爲匿名函數 we(function(something) { console.log(something); },'Jade'); //輸出: Nodejs is cool Jade is cool
同步:你打飯店電話問老闆有沒有位子,老闆說他去看一下,而後不掛電話,你一直等在電話前,老闆找了很久找到了位子,而後告訴你。這個過程就叫同步。瀏覽器
異步:你打飯店電話問老闆有沒有位子,老闆說他去看一下,而後就掛了電話,你去作別的事情,老闆找了很久找到了位子,而後再從新撥通你的電話告訴你。這個過程就叫異步。安全
同步:各個任務依次執行,下一個任務等待上一個任務完成以後再執行。微信
異步:各個任務獨立執行,A任務不須要等到B任務完成,就能夠先執行,直到B任務調用回調函數。多線程
在Node.js中,setTimeout(),setInterval()就是最基本的異步函數。異步
var c = 0 function printIt() { console.log(c) } function plus(callback) { setTimeout(function() { c += 1 callback() },1000) } plus(printIt)
I:input,磁盤的寫入。異步編程
O:output,磁盤的讀出。
在Node.js中,指代的就是一些讀寫的接口。
單線程:你談女友,一次只能談一個,談完了這個才能談下一個,這個就叫單線程。因此單線程安全。
多線程:若是你有能力腳踏多隻船,那麼這就叫多線程。若是你處理得好,平時的時候相安無事。但有時候你犯傻逼,女友們上房揭瓦,這個就叫爭搶資源。
單線程:只有到前面的流程執行完以後,纔會執行下一個流程。
多線程:同時執行多個程序。
Node.js就是一門單線程語言
阻塞:你打飯店電話問老闆有沒有位子,老闆說他去看一下,你掛下電話什麼事都不作,一直等到老闆查好位置來找你。這時候你的狀態就作阻塞。
非阻塞:你打飯店電話問老闆有沒有位子,老闆說他去看一下,你掛下電話跑去看電視玩電話,老闆查好位置來找你的時候你在去考慮吃飯的事情。這時候你的狀態就叫作非阻塞。
阻塞:前一個程序要等待後一個程序完成以後才能執行,前一個程序的狀態叫作阻塞。
var i = 0; while(1) { i++ } //這段程序對其餘程序產生了阻塞
非阻塞:前一個程序無需等待後一個程序完成以後才執行,前一個程序的狀態叫作非阻塞。
對於單線程的Node.js,咱們能夠經過回調的方式,實現異步編程,達到非阻塞的效果。
爲了講解Node.js裏的回調函數什麼時候被調用,咱們須要講解什麼是事件和事件驅動。
在瀏覽器中,鼠標點擊是事件,拖動窗口也是事件.
function clickIt(e) { window.alert('Button is clicked') } var button = document.getElementById('#button') button.addEventListener('click',clickIt) //按鈕被觸發了click事件以後,執行回調函數clickIt
像以下代碼中的clickIt函數執行的方式(被click事件觸發)稱爲事件驅動
function clickIt(e) { window.alert('Button is clicked') } var button = document.getElementById('#button') button.addEventListener('click',clickIt) //按鈕被觸發了click事件以後,執行回調函數clickIt
當存在不少事件觸發的回調函數排隊等待處理時,處理這些回調函數的管理機制稱爲事件循環。
事件循環是一個回調函數隊列,當有異步操做時,就將回調函數壓入這個隊列,等待處理。
事件循環是一個先進先出的任務隊列
整個隊列能夠理解成一個普通函數和回調函數構成的完整的隊列
只有理解了以上這些看似很空的概念以後,才能深刻學習node.js的http。但願你們和我一塊兒努力,若是有不理解的地方但願你們可以和我一塊兒在評論區討論。
如對個人文章感興趣,請關注微信公衆號「每日前端」,天天分享一篇優質前端文章。