Javascript 任务完成和回调函数执行之间是否存在延迟?

Javascript 任务完成和回调函数执行之间是否存在延迟?,javascript,node.js,callback,Javascript,Node.js,Callback,我正在学习Node.js和一些javascript。我读了一些想法,比如队列和执行堆栈 我试图计算websocket请求完成所需的时间。非常典型的发射形式如下: microtime1 = getTimeNow; socket.emit("message","data", function (error, data) { // calculate time taken by using microtime module by getting u

我正在学习Node.js和一些javascript。我读了一些想法,比如队列和执行堆栈

我试图计算websocket请求完成所需的时间。非常典型的发射形式如下:


microtime1  = getTimeNow;

socket.emit("message","data", function (error, data) {
    // calculate time taken by using microtime module by getting updated time and calculating difference.
       microtime2  = getTimeNow;
       time = microtime2 - microtime1;

})
如果我正在发送多条消息,我可以依靠回调立即执行,还是队列中出现阻塞而回调无法执行

换句话说,回调只在堆栈中一次调用,还是在队列中等待接收时执行?

希望,我能够解释我的问题。

换句话说,回调只会在堆栈中时被调用,还是在等待在队列中拾取时被执行

回调在等待的事件解析后执行

因此回调应该可以正常工作,但是有一个警告。因为node js是单线程的,所以您可能有另一个进程阻塞了主线程

例如,执行的简单视图可能如下所示。处理一个事件,然后再处理另一个事件。

然而,在现实中,它可能看起来更像这样

单线程仅适用于主线程,IO操作等操作在另一个专用线程上完成,该线程将在完成时通知主线程,然后可以在完成后执行回调

如果主线程在等待网络操作完成时变忙,则会出现此问题

但这很难预测,这取决于应用程序的其他部分在做什么。如果你的应用程序没有做任何其他事情,这可能不会成为问题。但是,IMHO,一个更好的方法是拨打数百或数千个电话,并允许获得一个平均值,这将解释导致三角洲差异的其他可能原因


其他数据来自

上图显示了 Node.js的执行过程。让我们一步一步地理解它

第一步 每当一个请求到达Node.js API时,传入的请求都会被删除 已添加到事件队列。这是因为Node.js无法处理 同时发送多个请求。第一次,传入的请求 将添加到事件队列中

步骤2 现在,您可以在图中看到,有一个循环始终存在 检查事件队列中是否有任何事件或请求可用。如果 任何要求都有,然后按照“先到先得”的原则 队列的“已服务”属性,请求将被服务

步骤3 此Node.js事件循环是单线程的,执行非阻塞 I/O任务,所以它向C++内部线程池发送请求,其中很多 可以运行多个线程。这个C++内部线程池是 在Libuv中开发的事件循环。这可以处理多个请求。现在, 事件循环反复检查事件中是否存在任何事件 队列如果有,那么如果 阻塞过程是存在的

步骤4 现在,内部线程池处理很多请求,比如数据库 请求、文件请求以及更多

步骤5 每当任何线程完成该任务时,回调函数都会调用 并将响应发送回事件循环

步骤6 现在,事件循环将响应发送回请求为 完成


嘿,这没有回答我的问题。我不需要连续的承诺。我只想能够正确计算从发送消息到收到答案之间的时间。我的理解是这是不可能的,因为回调可能在延迟后被调用。明白了,updatedI现在就得到它。谢谢,我还有一个问题-一个回调函数位于主线程中,它是否在等待时执行,并且主线程指针稍后只返回结果。。或者它是在主线程指针到达它时被执行的吗?它不存在,只有当它正在被处理时才在主线程中。该图表旨在说明这些方法是如何执行的(注意过去式)。主线程是一个循环,每次迭代都会经过几个步骤(如果它不忙,即计算CPU上的哈希值)。回调不在主线程中等待,启动它的事件将在它运行时调用它。