2013-04-23 76 views
0

对于每个请求可能需要一秒或两秒钟的应用程序,是否可能仅在事件循环的每次迭代中处理一段操作代码? 例如:处理Node.js中的下一个事件

function foo() 
{ 
    ...operative code... 
    ...start processing the next event here... 
    ...continue with foo() here.... 
} 

难道是这样的?

function foo() 
{ 
    ...operative code... 
    process.nextTick(function() { 
     ...continue with foo() here... 
    }); 
} 

如果这样做的话,Node是否会自动开始处理队列中下一个事件?

+0

您的操作代码是基于IO吗?通常,当我有一些运行一两秒钟的东西时,大部分是IO时间。如果是这种情况,那么节点将自动处理并发,因为它的IO模型是非阻塞的。 – tilleryj 2013-04-23 20:24:36

+0

@tilleryj假设它不是基于IO的,是否有办法跳到下一个事件并稍后回来继续处理? – alf 2013-04-23 20:26:20

+0

@tilleryj我意识到这需要非IO功能的很多代码需要一秒多的时间。但我真的只是想了解事件循环是如何工作的,以及我对它有多少控制。 – alf 2013-04-23 20:28:23

回答

1

如果时间花在IO中,节点的非阻塞模型将自动处理并发。

如果它不在IO中使用,那么您正确使用process.nextTick来推迟代码的执行,以便其他请求有更改要处理。这里是一个很好的书面记录:

http://howtonode.org/understanding-process-next-tick

+0

谢谢。另外,所有节点的IO调用都是顺序的吗?假设我有类似'db.query(query,callback1); db.query(anotherQuery,callback2);'。是否会首先调用callback1? – alf 2013-04-23 21:06:36

+0

否。将按查询返回的顺序调用它们。 – tilleryj 2013-04-23 21:30:32

+0

但是如果两个调用都涉及写入磁盘呢?也许这样的事情会更好地说明我的问题,'file.write(somethingLong,callback1); file.write(somethingShort,callback2);'。在这种情况下,不会回调1总是首先被调用? – alf 2013-04-23 21:37:13

1

你的假设是正确的,你应该将工作分成执行的更小的块,并与process.nextTick安排下一个块。所有其他计划的事件需要在下一个滴答时间执行,将在您的所需执行块之前处理。