Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点JS SetTimeOut回调_Javascript_Node.js - Fatal编程技术网

Javascript 节点JS SetTimeOut回调

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

我一直在接受纽博斯顿频道(链接)上的node JS培训。下面给出了节点如何提供更好性能的示例

函数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秒,并立即返回
  • 再重复两次,总共5个计时器,计划从现在开始运行大约5秒
  • Javascript解释器将控制权返回到事件循环,因为它暂时无事可做
  • 然后大约5秒钟后,Javascript的内部部分将第一个计时器事件放入事件队列
  • 如果Javascript解释器当时没有执行任何操作,则会触发该事件并调用与该计时器事件关联的回调
  • 执行该回调
  • 当该回调执行时,事件队列中还有另一个计时器事件,JS解释器调用其回调来处理它
  • 完成回调后,将从事件队列中一次一个地提取接下来的3个计时器事件,并执行它们的回调
  • 这里没有Javascript线程。node.js中的Javascript是单线程的。所有内容都通过一个中心事件队列运行。Javascript的内部可能使用线程来执行异步操作(例如,异步文件I/O在其实现内部使用线程,但不用于运行Javascript)。当这些线程完成时,它们会将一个事件放入事件队列,当单node.js Javascript线程完成执行它所做的事情时,它会从事件队列中抓取下一个事件并执行与其相关联的回调

    我的猜测是,既然它是在异步模式下运行的,那么就意味着一个单独的线程将处理每个调用,我的假设正确吗

    不,那是不对的
    setTimeout()
    为将来的某个时间安排计时器事件。没有与计时器事件关联的Javascript线程。可能有也可能没有一个系统线程管理所有计时器事件(这是特定于实现的,并不重要——也可能是每当Javascript返回到事件循环时,它只检查是否触发下一个计时器事件)。当计时器触发的时间到达时,会将一个事件插入Javascript事件队列。JS解释器然后从事件循环中拾取该事件,下次处理完成时,它将查找下一个要处理的事件

    下面给出了一个关于节点如何提供更好性能的示例

    我认为他们试图展示的是,由于node.js异步事件驱动设计,异步事件(如计时器)没有多个线程。这使得它在同时进行大量异步操作时能够更好地扩展,因为它的模型比每个计时器都有一个系统线程的模型效率更高

    如果您运行该示例,您会注意到,首先所有订单一次下,这是正常的,然后所有订单也交付一次,这是不正常的,因为每个调用已经应用了5秒的超时约束

    该代码实际上是在一行中运行5个
    setTimeout()
    调用,这些调用都将计时器设置为从现在起5秒后启动<代码>设置超时()是非阻塞的。这意味着它从现在开始将计时器的时间安排为5秒,然后立即转到下一行代码,这行代码也将从现在开始将计时器的时间安排为5秒。因此,从现在起,您将有5个计时器,所有计时器都安排在5秒左右(可能是