2

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

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

你会如何安排这些活动?在线程系统中,设计相当“简单”。您将线程专用于特定的任务集,然后走上线程同步的道路。虽然这些任务的需求量很低,但线程处于空闲状态,什么也不做。当需要他们时,他们会运行他们的代码。虽然这条路有问题,但它有据可查,并且得到了解决。

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

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

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

2 回答 2

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 提供请求,而不会中断第一个请求的数据生成

于 2012-08-09T14:06:24.917 回答
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)) 
}
于 2019-04-07T15:13:14.283 回答