DAY10: setTimeout和setImmediate的比较

今日要介绍的最後一个是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);

执行结果:
https://ithelp.ithome.com.tw/upload/images/20210921/20140244dJvbLEzQU5.jpg

这样乍看之下好像setTimeout()setImmediate()还要来的快..
但!!!先别妄下结论,如果多执行几次呢?
执行结果:
https://ithelp.ithome.com.tw/upload/images/20210921/20140244aACXHS6c1f.jpg

从执行结果可以看到,每一次的执行结果都不一定相同!
时而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入门>>
执行结果:
https://ithelp.ithome.com.tw/upload/images/20210921/20140244M2Ra2zc5sH.jpg

那麽还会有反转吗?多执行几次看看结果。
执行结果:
https://ithelp.ithome.com.tw/upload/images/20210921/20140244HXpbH0Wewm.jpg

不会再有反转了~那麽为何会与上一个例子的结果不同呢?
因为readFile执行回调时,事件循环位在poll阶段,
故事件循环会先到check阶段执行setImmediate(),再来进入timers阶段执行setTimeout()

总结:
把这两个方法放在I/O的回调中,就永远都是setImmediate()会先执


<<:  电子书阅读器上的浏览器 [Day22] 翻译功能 (IV) 内容分页

>>:  Day7 - 2D渲染环境基础篇 III[ 变形与阵列运算 ] - 成为Canvas Ninja ~ 理解2D渲染的精髓

[Day 5]新手村外的首战是史莱姆应该是定番吧(後端篇)

今天我们实作Users的CRUD,但今天因为花很多时间在前端的Header的排版,所以没有什麽时间可...

【Day 29】Custom post type,让你海量的文章也能分类起来

当你制作了海量文章,你应该会发现一个问题,就是这些文章很难简单地找出来,极为不方便於你,进行打理。你...

DAY1 揭开序幕与 MongoDB 简介

DAY1 揭开序幕与 MongoDB 简介 前言 终於鼓起勇气要报名 iThome 铁人赛! 本系列...

Day08:别为了钱而放弃权力

今天来谈谈修饰子(Modifier)。 修饰子我觉得可以分为三大类,第一种就是封装用的修饰子,第二种...

30天打造品牌特色电商网站 Day.1 网站介面基础知识

处在疫情时代,电商已然成为时下的热门趋势,电商平台多元且方便,简单几步骤就能轻松开店创业,但如何在高...