4

本文通过简单易懂的方式(例子+概念)讲解了以下几个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。希望大家和我一起努力,如果有不理解的地方希望大家能够和我一起在评论区讨论。

如对我的文章感兴趣,请关注微信公众号“每日前端”,每天分享一篇优质前端文章。 图片描述


Vagor
726 声望44 粉丝

稳住,稳住啊!!