Javascript 节点JS SetTimeOut回调
我一直在接受纽博斯顿频道(链接)上的node JS培训。下面给出了节点如何提供更好性能的示例Javascript 节点JS SetTimeOut回调,javascript,node.js,Javascript,Node.js,我一直在接受纽博斯顿频道(链接)上的node JS培训。下面给出了节点如何提供更好性能的示例 函数placeAnOrder(订单号){ console.log(“下单”,订单号); cookAndDeliver(函数(){ console.log(“已交付订单”,订单号); }); }; 函数cookAndDeliver(回调){ setTimeout(回调,5000); }; placeAnOrder(1); placeAnOrder(11); placeAnOrder(111); plac
函数placeAnOrder(订单号){
console.log(“下单”,订单号);
cookAndDeliver(函数(){
console.log(“已交付订单”,订单号);
});
};
函数cookAndDeliver(回调){
setTimeout(回调,5000);
};
placeAnOrder(1);
placeAnOrder(11);
placeAnOrder(111);
placeAnOrder(1111);
placeAnOrder(11111)代码>它确实遵守超时。超时用于回调,而不是函数的执行。所以发生的情况是,所有函数调用都是异步执行的,它们都等待了五秒钟,然后返回。所以他们从开始到结束都用了五秒钟。节点不必在第二个函数完成之前等待第一个函数完成
基本上是一个非平凡的例子,即等待db调用。在发送第二个db调用之前,不必等待一个db调用完成。如果数据库是线程化的,您几乎可以同时获得结果。它确实遵守超时。超时用于回调,而不是函数的执行。所以发生的情况是,所有函数调用都是异步执行的,它们都等待了五秒钟,然后返回。所以他们从开始到结束都用了五秒钟。节点不必在第二个函数完成之前等待第一个函数完成
基本上是一个非平凡的例子,即等待db调用。在发送第二个db调用之前,不必等待一个db调用完成。如果数据库是线程化的,您几乎可以同时获得结果。以下是事件顺序:
首先调用placeAnOrder()
cookAndDeliver()
setTimeout()
setTimeout()
将计时器事件从现在起安排5秒,并立即返回placeAnOrder()
cookAndDeliver()
setTimeout()
setTimeout()
将计时器事件从现在起安排5秒,并立即返回placeAnOrder()
cookAndDeliver()
setTimeout()
setTimeout()
将计时器事件从现在起安排5秒,并立即返回setTimeout()
为将来的某个时间安排计时器事件。没有与计时器事件关联的Javascript线程。可能有也可能没有一个系统线程管理所有计时器事件(这是特定于实现的,并不重要——也可能是每当Javascript返回到事件循环时,它只检查是否触发下一个计时器事件)。当计时器触发的时间到达时,会将一个事件插入Javascript事件队列。JS解释器然后从事件循环中拾取该事件,下次处理完成时,它将查找下一个要处理的事件
下面给出了一个关于节点如何提供更好性能的示例
我认为他们试图展示的是,由于node.js异步事件驱动设计,异步事件(如计时器)没有多个线程。这使得它在同时进行大量异步操作时能够更好地扩展,因为它的模型比每个计时器都有一个系统线程的模型效率更高
如果您运行该示例,您会注意到,首先所有订单一次下,这是正常的,然后所有订单也交付一次,这是不正常的,因为每个调用已经应用了5秒的超时约束
该代码实际上是在一行中运行5个setTimeout()
调用,这些调用都将计时器设置为从现在起5秒后启动<代码>设置超时()是非阻塞的。这意味着它从现在开始将计时器的时间安排为5秒,然后立即转到下一行代码,这行代码也将从现在开始将计时器的时间安排为5秒。因此,从现在起,您将有5个计时器,所有计时器都安排在5秒左右(可能是