本文通过简单易懂的方式(例子+概念)讲解了以下几个http进阶概念,同时联系node.js,讲解了node.js中的HTTP原理。大家在看这篇文章之前,希望先确保了解了此文罗列的概念。
因为本文只是用最简单的Node来讲解,所以也适用于非Node学习者。
什么是回调?
例子
你打饭店电话问老板有没有位子,老板说他去看一下,然后就挂了电话,你去做别的事情,老板找了好久找到了位子,然后再重新拨通你的电话告诉你。老板找到位子后回拨电话这个动作叫做回调。
概念
回调函数就是某个函数执行完毕后执行的函数。
联系Node.js
//回调函数为具名函数
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
在Node.js中,setTimeout(),setInterval()就是最基本的异步函数。
var c = 0
function printIt() {
console.log(c)
}
function plus(callback) {
setTimeout(function() {
c += 1
callback()
},1000)
}
plus(printIt)
什么是I/O?
概念
I:input,磁盘的写入。
O:output,磁盘的读出。
联系Node.js
在Node.js中,指代的就是一些读写的接口。
什么是单线程/多线程?
例子
单线程:你谈女朋友,一次只能谈一个,谈完了这个才能谈下一个,这个就叫单线程。所以单线程安全。
多线程:如果你有能力脚踏多只船,那么这就叫多线程。如果你处理得好,平时的时候相安无事。但有时候你犯傻逼,女朋友们上房揭瓦,这个就叫争抢资源。
概念
单线程:只有到前面的流程执行完之后,才会执行下一个流程。
多线程:同时执行多个程序。
联系Node.js
Node.js就是一门单线程语言
什么是阻塞/非阻塞?
例子
阻塞:你打饭店电话问老板有没有位子,老板说他去看一下,你挂下电话什么事都不做,一直等到老板查好位置来找你。这时候你的状态就做阻塞。
非阻塞:你打饭店电话问老板有没有位子,老板说他去看一下,你挂下电话跑去看电视玩电话,老板查好位置来找你的时候你在去考虑吃饭的事情。这时候你的状态就叫做非阻塞。
概念
阻塞:前一个程序要等待后一个程序完成之后才能执行,前一个程序的状态叫做阻塞。
var i = 0;
while(1) {
i++
}
//这段程序对其他程序产生了阻塞
非阻塞:前一个程序无需等待后一个程序完成之后才执行,前一个程序的状态叫做非阻塞。
单线程、回调、异步、非阻塞,结合Node.js的一句话总结
对于单线程的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。希望大家和我一起努力,如果有不理解的地方希望大家能够和我一起在评论区讨论。
如对我的文章感兴趣,请关注微信公众号“每日前端”,每天分享一篇优质前端文章。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。