nodejs中的连续任务
我使用nodejs快速为我的webapp,我需要不断运行一些代码,检查是否有一些数据更改,然后更新我的MongoDB。
我怎样才能轻松创build一个与主要任务一起运行的后台进程? 以便后台任务/进程可以通知主要任务。
我已经尝试过了:
- 在主进程中用“setInterval”函数解决这个问题 – >我没有问题,但认为它不是一个好主意,因为它阻止了节点事件循环
- 使用subprocess – >我找不到一个很好的教程 – >有没有更简单的方法,也许是一个图书馆,可以帮助我?
- 一些后台工作者库 – >但是在subprocess上执行重负载任务并完成,但是我需要始终执行这项工作
更新:
最终解决scheme
UpdateEvent.js :
var events = require('events'); function Updater(time) { this.time = time; this.array = [ {number: 1}, {number: 2} ]; var that; events.EventEmitter.call(this); this.init = function() { that = this; console.log("Contructor"); //Start interval setInterval(that.run,that.time); }; this.run = function() { that.array.forEach(function (item) { if(item.number === 2) { that.emit('Event'); } }); }; } Updater.prototype.__proto__ = events.EventEmitter.prototype; module.exports = Updater;
然后使用它的代码:
server.js :
var Updater = require('./UpdaterEvent'); var u = new Updater(10000); u.init(); u.on('Event',function () { console.log("Event catched!"); });
我按照教程在: http : //www.sitepoint.com/nodejs-events-and-eventemitter/
问题是您导出Updater
构造函数的方式:
exports.Updater = Updater;
当你需要的时候,你就可以
var Updater = require('./UpdaterEvent');
然后尝试运行:
var u = new Updater(10000);
问题是你不会暴露函数本身,而是一个名为Updater
的属性的对象,其中包含该函数。 因此,您必须使用导出它
module.exports = Updater;
或者你必须要求使用:
var Updater = require('./UpdaterEvent').Updater;
无论哪种方式,然后调用new Updater()
将工作。 目前,您尝试通过调用对象而不是构造函数来初始化新对象,因此会出现错误消息:
TypeError:对象不是一个函数
你应该看看事件和EventEmitter
因为JS是asynchronous的,所以你可以使用你并不需要的subprocess。 只需为后台进程创build一个函数,并将其传递给eventEmitter对象。 你可以使用setInterval或while(true)循环来连续检查数据的变化。 当数据改变时,调用eventEmitter.emit('someEvent'); 这将在你的主要任务中触发一个函数来更新你的mongoDB。