本文经过简单易懂的方式(例子+概念)讲解了如下几个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。但愿你们和我一块儿努力,若是有不理解的地方但愿你们可以和我一块儿在评论区讨论。
如对个人文章感兴趣,请关注微信公众号“每日前端”,天天分享一篇优质前端文章。