今日要介绍的最後一个是setTimeout()
,在DAY6: Node 的内部机制(二)的非阻塞范例中有短暂介绍过,但因为那时候的重点在於非阻塞的处理,所以没有做太多的说明,所以今天就来介绍它到底是何方神圣罗!!
setTimeout()
是透过指定毫秒数後,执行一遍调用函数(若要需要重复执行
的话请使用setInterval()
,但这个方法先不在我们讨论范围内)。
依据DAY9: setImmediate 与 nextTick的比较的内容已知setImmedidate方法的特性会在事件循环阶段的poll阶段结束後执行,那麽setTimeout方法与它相较之下,谁又会先後呢?
实际例子:
//setImmediate与setTimeout
setImmediate(function(Nicole)
{
console.log('immediate!!');
});
setTimeout(function(nicole)
{
console.log('Timeout');
},0);
执行结果:
这样乍看之下好像setTimeout()
比setImmediate()
还要来的快..
但!!!先别妄下结论,如果多执行几次呢?
执行结果:
从执行结果可以看到,每一次的执行结果都不一定相同!
时而setTimeout()
快时而setImmediate()
,这是因为无法知道程序码在执行时,事件循环到了哪一个阶段了,
所以这两个方法同时存在时,回调函数的执行先後不一定是固定的!
那如果不单单执行log
语句呢?请看以下例子
//setImmediate与setTimeout I/O操作
require('fs').readFile("butterfly.txt",function(Nicole)
{
setImmediate(function(Nicole)
{
console.log('immediate !!');
});
setTimeout(function(Nicole)
{
console.log('Timeout !! ');
},0);
});
程序码改编於参考书作者李锴<<新时期的Node.js入门>>
执行结果:
那麽还会有反转吗?多执行几次看看结果。
执行结果:
不会再有反转了~那麽为何会与上一个例子的结果不同呢?
因为readFile执行回调时,事件循环位在poll阶段,
故事件循环会先到check阶段执行setImmediate()
,再来进入timers阶段执行setTimeout()
总结:
把这两个方法放在I/O的回调中,就永远都是setImmediate()
会先执
<<: 电子书阅读器上的浏览器 [Day22] 翻译功能 (IV) 内容分页
>>: Day7 - 2D渲染环境基础篇 III[ 变形与阵列运算 ] - 成为Canvas Ninja ~ 理解2D渲染的精髓
今天我们实作Users的CRUD,但今天因为花很多时间在前端的Header的排版,所以没有什麽时间可...
当你制作了海量文章,你应该会发现一个问题,就是这些文章很难简单地找出来,极为不方便於你,进行打理。你...
DAY1 揭开序幕与 MongoDB 简介 前言 终於鼓起勇气要报名 iThome 铁人赛! 本系列...
今天来谈谈修饰子(Modifier)。 修饰子我觉得可以分为三大类,第一种就是封装用的修饰子,第二种...
处在疫情时代,电商已然成为时下的热门趋势,电商平台多元且方便,简单几步骤就能轻松开店创业,但如何在高...