🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
Node.js的特点:**只用一个线程来处理所有的请求,事件驱动编程** * 店小二:线程 * 顾客:HTTP请求 * 第一类工作(迎客、找座、下单):在服务器端的代码,能快速的执行 * 后厨做菜,客人吃饭:耗时的IO操作 * 后厨大喊一声上菜:长时间IO操作之后发出的**事件** * 结账:另一个长时间IO操作完成后发出的**事件** * 第二类工作(上菜、结账):需要等待耗时的IO操作完成之后才能开始,也就是需要收到系统发出的**事件**之后才能开始执行。在Node.js中实际是在**回调函数**来执行 ``` 迎客 (); 找座 (); 下单 (); 后厨处理 ("做菜完成事件", function(){ 上菜处理 (); 客人吃饭 ("吃饭完成事件",function(){ 结账处理 (); 送客 (); }); }); ``` 需要注意的是: * 后厨处理()这个函数需要接收两个参数 1. 事件名: 2. 匿名回调函数,事件发生,回调函数才会执行 Node.js使用Chrome的V8引擎来执行JavaScript,效率非常高 * 代码能否写成? ``` 迎客 (); 找座 (); 下单 (); 后厨处理 ("做菜完成事件", function(){ 上菜处理 (); }); 客人吃饭 ("吃饭完成事件",function(){ 结账处理 (); }); 送客 (); ``` 不能。 因为 Node.js 执行 "后厨处理 ()" 函数时,只是安插了一个匿名的回调函数在那里,并不会等待(非阻塞 I/O),反而马上 会执行 “客人吃饭 ()" 函数,所以上述的写法会引起逻辑上的错误: 还没上菜就开始吃饭了! 所以写惯了” 顺序阻塞 I/O“的我们需要改变一下思维方式,进入到事件驱动的世界中来。 * 如果某个操作,比如说“上菜处理”是个CPU密集型的计算任务,Node.js那个唯一的线程就会忙于执行这个计算任务而被阻塞住了。后果是整个服务器就无法响应了。需要把这样的代码进行异步处理,也变称Node.js所擅长的事件驱动方式