2012-08-09 57 views
3

Node.js的方法是事件驱动的,我想知道你将如何解决何时发生事件的问题?如何开发node.js运行时策略?

比方说,我们有一个Web应用程序的一些操作:创建一些数据,服务页面,

你会如何铺陈这些事件的接收数据等?在一个螺纹系统中,设计相当“简单”。您将线程专用于特定的一组任务,并沿着线程同步的方向前进。尽管这些任务处于低需求状态,但线程却处于空闲状态,什么也不做。当他们需要时,他们运行他们的代码。虽然这条道路存在问题,但它有很好的文件记录和解决方法。

我发现很难绕过node.js事件处理方式。 我有10个请求进来,但我没有创建任何数据,所以我不能任何服务,创建数据是一个长期的行动,另外5个客户端想发送数据。现在怎么办?

UPDATE: 在试图环绕这个问题我已经创建了下面的代码我的头,这是未经测试却又如此裸露与我在这里。该代码基本上是一堆回调,它们被注册并且应该被执行。将会有某种桩管理器可以运行并决定现在要执行的代码。该回调创建的所有回调都可以“自然”添加到偶数循环中。它也应该注册它自己,所以事件循环可以将控制权交还给它。其他内容如静态内容和可以以不同方式绑定的内容。

  1. 如何在当前事件循环状态下注册回调为最后一个回调?
  2. 这是解决此问题的好方法吗?

正确答案:

选择的答案是最正确的,只有一个小的代码变化,那就是:

变化从这个这个功能:

getDetail : function (id, callback) { 
    var data = makeMyData(id); 
    callback(data) 
} 

至:

getDetail : function (id, callback) { 
    var data = makeMyData(id); 
    setTimeout(callback,0,data); 
} 

回答

3

来自线程化环境的最重要的事情是,在节点中,您不必等待某个操作完成,而是告诉它在完成操作时该做什么。为此,您使用回调函数,这是一个包含要执行的函数的变量,或者如果您愿意,可以使用指向函数的指针。

例如:

app.get('/details/:id?', function (req, res) { 
    var id = req.params.ucid, 
     publish = function (data) { 
      res.send(data); 
     }; 
    service.getDetails(id, publish); 
}); 

然后,您可以调用,一旦你已经创建了所需的数据您的获取详细信息的方法内发布方法。

getDetail : function (id, callback) { 
    var data = makeMyData(id); 
    callback(data) 
} 

然后,它会将您的数据发布回响应对象。由于事件循环节点将继续向这个URL提供请求而不会中断第一个请求的数据生成

+0

因此,因为您注册了一个回调函数,并且不从函数返回值,所以实际上让事件循环处理它?不回调(数据)现场计算? – qballer 2012-08-09 14:15:03

+0

你是正确的回调(数据)会被当场调用,这是我害怕的一个坏例子。如果您正在执行冗长的I/O操作,则最好使用事件发射器。一旦I/O或数据生成操作完成,它就会发出一个完整的事件,其中可以包含填充数据的回调。 有关事件发射器的更多信息,请参阅[链接](http://nodejs.org/api/events.html) – 2012-08-09 15:10:41

+0

您可以随时重构您的答案。 – qballer 2012-08-09 15:18:26