Node.js中使用计时器定时执行函数详解

2020-06-17 05:36:47易采站长站整理

在处理事件时,如果使用了内存敏感或者处理器敏感的函数,会导致事件循环变得缓慢,而且造成大量事件堆积,不能被及时处理,甚至堵塞队列。

看下面堵塞事件循环的例子:

                   process.nextTick(function nextTick1() {

                            var a = 0;

                            while(true) {

                                     a ++;

                            }

                   });

                   process.nextTick(function nextTick2() {

                            console.log(“next tick”);

                   });

                   setTimeout(function timeout() {

                            console.log(“timeout”);

                   }, 1000);

这个例子里,nextTick2和timeout函数无论等待多久都没机会运行,因为事件循环被nextTick函数里的无限循环堵塞了,即使timeout函数被计划在1秒钟后执行它也不会运行。

         当使用setTimeout时,回调函数会被添加到执行计划队列,而在这个例子里它们甚至不会被添加到队列。这虽然是个极端例子,但是你可以看到,运行一个处理器敏感的任务时可能会堵塞或者拖慢事件循环。

退出事件循环

使用process.nextTick,可以把一个非关键性的任务推迟到事件循环的下一轮(tick)再执行,这样可以释放事件循环,让它可以继续执行其它挂起的事件。

看下面例子,如果你打算删除一个临时文件,但是又不想让data事件的回调函数等待这个IO操作,你可以这样延迟它: