该书对我学习nodejs帮助不少,感谢朴灵。 但读到关于事件循环章节就看不下去了,因为理解不到其对事件循环原理的解释。 他提到这么一段,大意是:在node进程启动时,node就创建一个while循环,检查观测者(事件队列)中是否有事件存在,如果存在就取出事件,执行回调函数后继续循环,如果不存事件就退出进程。 他举了一个生动的例子:餐馆的厨师获取前台妹子收到的客户订单,之后根据订单做菜。做完一单取下一单,如此往复。如果没有订单就下班打烊和妹子约去了。
我疑问就来了,餐馆的老板朴灵对员工这么好吗?是不是厨师早上来上班,如果还没有客人来吃饭,就可以马上下班了,之后来的客人就只能吃闭门羹了?
同样的问题,如果有一个很耗时的IO操作,IO还未完成,还未把事件给到观测者,则在while循环中,还没有在观测者中取得事件。按朴灵的说法,该循环就要退出进程了。那么当这个IO完成后,这个事件回调就不会执行了?
再问个问题,node进程启动,是不是指在CMD执行 node app.js之后?这时就产生循环了?
下面是我对循环的理解,请大神指点纠正,谢谢! 1、假设我们在一个web应用中请求一个链接,执行了一个js文件,js文件代码按顺序同步执行,遇到IO操作,node api把这些异步操作扔给线程池处理,并在队列中记录这个IO操作,继续向下执行,记录所有的IO操作到队列中; 2、执行了js文件的最后一行后,才生成一个事件循环,循环检查第一步中记录了IO操作的队列,检查队列中的记录是否有对应的事件,如果有就取出事件执行回调,如果没有就继续循环下去; 3、继续循环检查队列中的记录,直到所有记录都产生了事件,并执行回调。这时才结束循环退出进程; 4、如果上面的循环还未结束,我们又请求了一个链接,这个请求的js程序就等待上面的循环完成才开始执行(因为是单线程web服务,所有请求都是在同一个线程中,循环也是在相同的线程中运行,所以要等待)。这个js程序也像2、3步一样的过程,在程序执行到最后一行之后,又生成一个循环,检查队列记录,执行事件。
by lhz