在节点中等待回调时运行任意代码?

时间:2014-12-03 18:56:35

标签: javascript node.js callback

我现在是Node的初学者。我知道回调会阻止Node在等待I / O或其他进程时阻塞,但Node在等待I / O完成时做了什么?我在nodejitsu上读到的一个教程说:“回调是在给定任务完成时调用的函数;这可以防止任何阻塞,并允许其他代码在此期间运行。”但它运行的其他代码是什么?假设给定块的其他代码依赖于从数据库中检索的信息。 Node可以在等待回调时处理其他连接,还是只能在当前块中运行其他代码?

2 个答案:

答案 0 :(得分:2)

节点处理事件队列。当您启动异步操作时,该操作将独立于后台节点进行。 Node继续在当前执行线程中运行其余代码,直到它到达执行线程的末尾(例如,所有内容都返回到堆栈顶部)。当节点正在运行当前执行线程时,没有其他执行线程将在节点中运行(忽略当前的生成器和光纤)。这就是人们将其称为单线程的原因。它按顺序一次运行一个特定的执行线程,而不是并行执行多个线程。必须在下一个运行之前完成。

当一个执行线程完成时,如果事件队列中还有其他事件,则节点将从队列中弹出下一个事件并运行它。事件队列中的其他事件可以来自任何事物。它们可以来自计时器,来自刚启动的异步事件,也可以来自程序中其他位置的异步事件(例如,在您的特定问题中完成的其他数据库操作)。如果没有其他事件(因此没有准备好运行代码),那么节点只会等到下一个事件发生(除了垃圾收集之外什么都不做)。

然后,当异步操作完成时(在后台),它会向事件队列添加一个事件来调用它的回调。如果此时节点中当前没有其他任何内容正在运行,那么将运行该异步回调事件。如果当前正在节点中运行其他东西,那么该操作将完成执行,当它执行时,事件队列中的下一个事件将运行,依此类推......

通过这种方式,nodejs中一次只有一个执行线程。当一个完成时,nodejs执行引擎从事件队列中获取下一个事件并运行它。当异步操作完成并想要调用它们的回调时,它们会将事件插入到事件队列中。

描述事件队列并包含一些其他引用的

This answer是为浏览器编写的,但几乎所有相同的规则都适用于nodejs,因此它也可以帮助您了解更多相关信息。

答案 1 :(得分:0)

等待时什么都不做。但它可能会等待多个IO操作完成,然后将调用首先完成的回调。因此,如果您正在等待多个连接,节点将在每次打开连接时执行某些操作。如果第一个连接触发的某些代码在此期间注册了一个等待某个文件IO的回调,它甚至会这样做。