Javascript 是否可以在node.js中组合回调和事件
我希望将MongoDB数据库作为一个child_进程运行,因为某些数据库操作需要花费大量时间,我不希望应用程序的其余部分冻结 我能够将数据库代码放入一个模块中,该模块通过child_进程中的事件发射器进行反应和响应 以下是简化版本(db process.js)中的代码: 挑战在于,我希望能够通过传递回调函数来使用数据库模块。这将使它更容易在我的所有其他模块中使用。但是如何将事件中的变量放入回调函数中呢?这可能吗 下面显示了我在简化版本(db controller.js)中未完成的尝试: 所以我希望能够像这样使用这个模块:Javascript 是否可以在node.js中组合回调和事件,javascript,node.js,mongodb,child-process,Javascript,Node.js,Mongodb,Child Process,我希望将MongoDB数据库作为一个child_进程运行,因为某些数据库操作需要花费大量时间,我不希望应用程序的其余部分冻结 我能够将数据库代码放入一个模块中,该模块通过child_进程中的事件发射器进行反应和响应 以下是简化版本(db process.js)中的代码: 挑战在于,我希望能够通过传递回调函数来使用数据库模块。这将使它更容易在我的所有其他模块中使用。但是如何将事件中的变量放入回调函数中呢?这可能吗 下面显示了我在简化版本(db controller.js)中未完成的尝试: 所以我希
var dbController = require('./db-controller.js');
dbController.getRecord(function(record)){
// Do something with record...
});
关于如何实现这一点有什么想法吗?据我所知,您不能在节点实例(主实例和分叉实例)之间传递回调,但可以传递数据 在您的案例中,您将使用worker pool模块,workers实例将在其中处理所有db查询,master(池实例)将向这些worker发送数据,并在完成查询时收集结果
这是我在github上做过的一个,但在npm上还有一些其他选择。另一个选择是完全解耦流程。我以前在Amazon上使用过SQS,我将数据放入队列中,还有另一个服务器/进程侦听、唤醒并处理这些项目。这是一个非常简单的模型。如果不在AWS上,您可能会使用rabbitmq之类的东西。这样,您的应用程序服务器就不会被阻塞,因为它只是将数据转储到队列并继续
var childProcess = require('child_process');
var dbProcess = childProcess.fork('./db-process.js');
dbProcess.on('message', function(msg) {
switch(msg.name){
case 'getRecord':
var record = msg.record;
break;
case 'saveRecord':
// Handling here...
break;
}
});
var controller = {};
controller.getRecord = function(onQueryDone){
dbProcess.send({name: 'getRecord'});
// How to call the callback function with data when it is received? Basicly want the record variable from the switch.
onQueryDone(record);
};
controller.saveRecord = function(record, onQueryDone){
dbProcess.send({name: 'saveRecord'});
// Handling...
};
module.exports = controller;
var dbController = require('./db-controller.js');
dbController.getRecord(function(record)){
// Do something with record...
});