如何开发node.js运行时策略?

时间:2012-08-09 12:23:21

标签: javascript node.js event-driven-design

Node.js方法是事件驱动的,我想知道你将如何解决何时触发事件的问题?

假设我们在Web应用程序上有一些操作:创建一些数据,提供页面,接收数据等。

你会如何列出这些活动?在线程系统中,设计相当“简单”。您将线程专用于特定的任务集,并且您将继续执行线程同步。虽然这些任务处于低需求状态,但线程处于空闲状态并且什么都不做。当他们需要时,他们运行他们的代码。虽然这条道路存在问题,但它已经有了很好的记录并且有点解决了。

我发现很难绕过node.js事件处理方式。 我有10个请求进入,但我没有创建任何数据,因此我无法提供服务,创建数据是一个长动作,另外5个客户端想要发送数据。现在怎么办?

我创建了以下未经测试的代码,这些代码基本上是一堆已经注册并应该执行的回调。会有某种堆管理器运行并决定它现在要执行哪些代码。该回调创建的所有回调都可以“自然地”添加到偶数循环中。它也应该注册它自己,所以事件循环可以将控制权交还给它。其他一些东西,比如静态内容,以及不同的东西。

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

2 个答案:

答案 0 :(得分:3)

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

例如:

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

然后,您可以在创建所需数据后从get detail方法中调用publish方法。

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

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

答案 1 :(得分:0)

选择的答案是最正确的,只有一个小的代码更改,即:

从此更改此功能:

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

为此:

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

更新2019: 为了符合社区标准,我中断了对新答案的更新。 我使用setTimeout是因为我想将回调推迟到事件循环的后面。我使用的另一个选项是process.nextTick(),这有助于将回调推迟到当前事件处理结束时。 例如:

getDetail : function (id, callback) {
    var data = makeMyData(id);
    process.nextTick(((info)=> callback(info))(data)) 
}