Node.js方法是事件驱动的,我想知道你将如何解决何时触发事件的问题?
假设我们在Web应用程序上有一些操作:创建一些数据,提供页面,接收数据等。
你会如何列出这些活动?在线程系统中,设计相当“简单”。您将线程专用于特定的任务集,并且您将继续执行线程同步。虽然这些任务处于低需求状态,但线程处于空闲状态并且什么都不做。当他们需要时,他们运行他们的代码。虽然这条道路存在问题,但它已经有了很好的记录并且有点解决了。
我发现很难绕过node.js事件处理方式。 我有10个请求进入,但我没有创建任何数据,因此我无法提供服务,创建数据是一个长动作,另外5个客户端想要发送数据。现在怎么办?
我创建了以下未经测试的代码,这些代码基本上是一堆已经注册并应该执行的回调。会有某种堆管理器运行并决定它现在要执行哪些代码。该回调创建的所有回调都可以“自然地”添加到偶数循环中。它也应该注册它自己,所以事件循环可以将控制权交还给它。其他一些东西,比如静态内容,以及不同的东西。
答案 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))
}