• Node学习四 —— 函数执行规划


    函数执行

    本来首先应该介绍setTimeoutsetInterval这两个函数的,但是网上的详细教学已经很多了,所以就不再赘述,简单提一下需要掌握的几个点:

    • 在延迟一定时间之后调用函数
    • 取消定时器

    使用process.nextTick将函数推迟到下一轮事件循环

    上面两个延迟函数是在时间纬度上,将代码推迟一段时间然后再执行。而process.nextTick是在内存纬度,等到别的事件都执行完了,再执行需要延迟的代码。

    Node的事件循环在一个处理事件的队列里面循环运行,事件循环每被执行一次就被称为一个Tick。

    通过nextTick来取代setTimeout,回调函数会在事件队列内所有事件处理完毕之后立刻执行,这样效率更高,不用浪费额外时间等待:

    // process是Node中的全局对象!
    process.nextTick(function(){
    	// 自己的代码
    	myFunction();
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5

    阻塞事件循环

    JS都运行时采用的是单线程事件循环(不懂单线程多线程的可以简单查查概念),当有程序占用了很长的运行时间,那么程序就阻塞在这儿,后面的程序无法执行,会使得服务变得很卡。

    退出事件循环

    通过使用process.nextTick将一个关键性的任务推迟到下一个时间循环再执行,这样可以疏通循环。

    如,要删除之前创建的一个文件,但是又不想在对客户端做出响应之前删除,就可以这样:

    stream.on("data",function(data){
    	stream.end(res);
    	process.nextTick(function(){
    		fs.unlink("./myFile");
    	})
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    使用setTimeout代替setInterval强制代码串行执行

    假如你希望你的函数重复执行一些I/O操作(比如解析日志文件),可以使用setInterval函数,:

    const interval = 1000;
    setInterval(function(){
    	myF();
    })
    
    • 1
    • 2
    • 3
    • 4

    但是,考虑这样一种情况:你的函数运行时间大于一秒,即大于interval大小,这个时候,你希望串行执行的函数可能不再串行,而是并行,如果你在你的函数中进行发送请求等等操作,时间不确定性还很大,你无法确定怎么设定时间。

    因此,需要强制指定myF执行结束与下一个myF开始之间的时间间隔,可以这么做:

    const interval = 1000;
    (function x(){
    	setTimeout(function (){
    		myF(function(){
    			x();
    		});
    	},interval)
    }());
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    上面声明了一个名为x的立即执行函数,里面有个定时器,一秒之后将调用自己的函数,而自己的函数执行完毕后,又会调用作为回调函数的匿名函数,继续执行x,重复上面的过程。

  • 相关阅读:
    JS学习之BOM2
    Docker & Mysql实战:docker compose 搭建Mysql
    随机森林特征重要性
    Golang Struct 继承的深入讨论和细节
    5G+北斗:人员定位系统为化工厂定位赋能
    MySQL权限
    工业机器人在汽车制造行业中的应用
    unity sdk -AppLovin MAX 广告聚合平台接入+Firebase统计
    bp神经网络中bp是什么意思,bp神经网络是什么网络
    RocketMQ详解(一):RocketMQ架构详解
  • 原文地址:https://blog.csdn.net/qq_51574759/article/details/126775228