上一篇DAY5: Node 的内部机制(一)主要解释了JavaScript的同步与非同步,相信看完上一篇完再来看今天这篇就会相当好理解了,故建议看这篇之前先浏览前一篇。
但前一篇开头也有提到Node中阻塞与非阻塞,这是针对I/O 的调用。并非可以跟同步与非同步画上等号,主要是针对的状态不同,就Node的阻塞与非阻塞I/O 都是同步的,这部分还请多加理解!!
正式进入主题吧!
对於I/O分成数据的准备 与返回的结果,I/O会发出系统回调请求後,就一直处在等待的状态,等到数据准备与返回结果完成後,再重新运行。
举个例子:
function dataone(){
var start=new Date().getTime();
while (new Date().getTime()<start+5000);
}
dataone();
console.log("dataone 已更新完毕");
console.log("I am Nicole!!");
console.log("Nicole is me~");
执行结果:
实际处理这段程序码会发现,当执行dataone
这个的函数的更新,而当dataone
这个函数还没更新完时,下面三行log
只能等待!而当函数执行完後,才会相继出现。
而这边的
dataone();
是属於直接被调用的情况下,与接下来非阻塞的例子有很大的不同之处。
(这边特别说明的是例子中的这段
while (new Date().getTime()<start+5000);
可以调整毫秒的时间,只是透过这段执行时可以显现出等待时间的长短。)
基本和阻塞过程类似,但不同於阻塞的是,如果数据还没准备完成或是还在处理中,不须等待,直接执行,当数据准备完成再回调出来。
举个例子:
function dataone(done)
{
setTimeout(()=>
{
done();
}
,5000);
}
dataone(function()
{
console.log("dataone 更新完毕!!")
});
console.log("I am Nicole!!");
console.log("Nicole is me~");
执行结果:
再来:
这边结果会分成两段来呈现是因为在dataone
处理过程中需要等待,而等待的过程已经先把下面两行的log
呈现出来了,当dataone
处理完成後就会显示dataone
里面的内容!故分成两段图呈现是强调这等待的过程到结果的完整地呈现!
setTimeout()
是指定毫秒数调用函数。(这边拿来设定我的dataone
处理的时间,跟阻塞的例子一样可以自己调整等待的毫秒数)。
done
是代表回调函数。(告知将要传递的函数说参数函数已处理完毕)。
这边的
setTimeout(()=>
{
done();
}
,5000);
}
是作为参数传递给另一个函数
dataone(function()
{
console.log("dataone 更新完毕!!")
});
作为触发点才会执行回调函数。与阻塞例子中的
dataone();
直接拿来被取用有很大的区别!!!
一开始会参加铁人赛的原因是因为某堂课的要求(。・∀・)ノ゙ 既然都参加了当然就不能放弃这次的机会,藉...
在 WordPress 上架设的 Blog 已经完成了,也写了数篇的文章,在 Google 上已经可...
Decorator(装饰器) 是 Python 中很好用的一个东西,只要 @ 一下就可以处理掉很多东...
我们根据昨天的需求画出以下两张图 1. Flowchart 我们先看看 Flowchart 图中的白...
Elasticsearch在Uber的Marketplace Dynamics核心数据系统中扮演着关...