DAY5: Node 的内部机制(一)

今日主要会说明Node的内部运作,其实前面文章有提到Node其中是包含着JavaScript的元素。
了解这些机制後,在未来的实作中就能更理解系统的概念及运作。

callback称作回调或是回呼。主要是用来把函数一作为参数函数,传递给函数二,并且参数函数可以被执行。
这个callback函数可以拿来编写高阶的JavaScript程序。

在JavaScript的特性中是分成同步与非同步(异步)是针对进程与线程的调用。 而在Node中是阻塞与非阻塞,这是针对I/O 的调用。
而某种意义上虽然是差不多的...
但注意!并不是!不是!不是! 同步=阻塞,异步=非阻塞,因为针对的状态不同,就阻塞非阻塞而言都是同步的。

今天主要介绍JavaScript的同步与非同步。以下用有点生活化的例子解释。

何谓同步?

可以想像成国中的回家作业,会依序地记录在联络本上,而就按照顺序逐次完成,
若第一项是数学作业但还没完成(或是在某一题卡关了),那麽接下来的第二项国文习作就无法动工也无法完成。
需要把第一项的数学作业完成後,才能开始第二项国文习作。
总结来说,这有点强迫症,就是要按照纸本计画做事,前面的事项没有完成系统就不会做到第二项工作的准备。

实际举个例子:
请先建立一个JavaScript新档案,名为Test.js,指令如下:
使用console.log输出三句话(里面的英文文法请别太在意哈哈哈)。

//同步
console.log("Hello!!       I'm NO.1");
console.log("My name is Nicole!! I'm NO.2 ");
console.log("Goodbye Nicole!! I'm NO.3 ");

接下来请建立一个HTML的档案:

<html>
    <head>
        <script src="Test.js"></script>
    </head>
    <body>
    </body>
</html>

这个HTML结构大家应该很熟悉,就不做说明罗~

接下来我要看实际结果:
执行网站後,请在页面中点[右键]->[检查],接下来回出现页面请点选[主控台]
就可以看到执行结果,步骤画面如下:

https://ithelp.ithome.com.tw/upload/images/20210917/20140244nJh0HHfZ2E.jpg

https://ithelp.ithome.com.tw/upload/images/20210917/201402440ueoy8l4B6.jpg

这边可以看到结果,第一句指令会先被印出,再来是第二句印出,最後是第三句印出。

同步的结论:

同步它会依照你输入的指令顺序依次处理。

那就会有疑问啦~那万一我第一个指令的处理过程可能需要一些时间,那我後面的指令不都卡着了?
所以就有非同步的诞生啦!

何谓非同步?

当然就是与同步相反罗!
继续使用高中回家作业的解释,作业一样依序写在联络本上,第一项是数学作业,第二项还是国文习作,
现在我的数学作业卡关了!!
我为了後续的事情都不被因此停摆,我决定先做国文习作,等我数学有灵感後再回头完成。

Ok…举上面这个例子有点生活化只是为了方便理解,但又有点不能这样解释,实际换一个电脑上的例子,大家有在网路上下载过档案吧!
通常要下载一个档案需要一定的时间,假设我现在先下载一个影音档的时间需要五分钟好了,
再来我去下载另一个文档时间需要三秒就好了,那麽我不需要等影音档下载五分钟後我才可以得到文档的下载,
而是我先取得了文档,再得到影音档。

非同步的结论:

也就是我不会因为前面一个档案耗时太长,让我後续的程序大塞车,这样会给人一种效率高的表现。

实际例子:

//非同步
//设立一个函数
function Nicole()
{
    console.log("Hello!! I'm NO.1");
}
console.log("My name is Nicole!!  I'm NO.2");
//设定回调函数与毫秒数
setTimeout(Nicole,5000);
console.log("Goodbye Nicole!!  I'm NO.3");

我指令顺序与同步的例子是一样的,最後可以去比较一下两者的结果。
但是喔!!要注意的是 setTimeout(回调函数,毫秒数),我让Nicole这个函数等待五千毫秒(=五秒)後再执行。
(也可以想成Nicole档案下载时间需要五秒)
执行结果:
https://ithelp.ithome.com.tw/upload/images/20210917/20140244v93Pva6qKp.jpg

五秒後:
https://ithelp.ithome.com.tw/upload/images/20210917/20140244FvqvlQzoHf.jpg

五秒後才会出现Nicole这个函数我要执行的指令。

总结论:

可以看到同步与非同步的结果输出的顺序是不一样的,前着是按部就班的乖乖牌,後者是时间管理大师。

可以透过两者例子的结果,去比较为何明明输入指令顺序一样,但输出结果不一样。
也可以多去尝试交换顺序或是等待秒数,自己反覆多测试几次就可以理解了。

明天会接续着今天的概念来解释Node的阻塞与非阻塞。


<<:  今天学会了env虚拟环境

>>:  【Day04】数据输入元件 - Checkbox

Day2 线性回归(Linear Regression)

线性回归是什麽? 讲人话就是利用以往蒐集的资料建立一个预测未来走势的模型,当输入新的值[自变数(in...

[Day21] 在 Codecademy 学 React ~ What's this? This is "this"! 之 this.props 篇

前言 今天要来讲 this.props 了, 但在那之前我发现我还没讲过 this XD 就跟学英文...

Valid ServiceNow CIS-PPM Dumps - Best Exam Preparation Material

Start Exam Preparation with Real ServiceNow CIS-PP...

Day 08:八爪章鱼之 tmux 快捷键

今天的 Home 目录没有修改,https://github.com/simba-fs/2021-...

韩乡韩国料理 #韩式小菜吃到饱

这是我第一次去韩乡,也是唯一的一次。 上图是「韩式起司辣鸡」。韩乡的料理还不错,价位介於200元上下...