【问题标题】:Continuous tasks in nodejsnodejs中的连续任务
【发布时间】:2014-06-10 15:22:24
【问题描述】:

我正在为我的 webapp 使用带有 express 的 nodejs,我需要连续运行 一些代码检查某些数据是否更改,然后更新我的 mongodb。

如何轻松创建一个与主要任务一起运行的后台进程?这样后台任务/进程就可以通知主任务了。

我已经尝试过的:

  • 在主进程中使用“setInterval”函数解决这个问题 --> 我工作没有问题,但认为这不是一个好主意,因为它阻塞了节点事件循环
  • 使用子进程 -> 我找不到关于它们的好教程 -> 有没有更简单的方法,也许是可以帮助我的库?
  • 一些后台工作库 -->但是在子进程上执行繁重的任务并完成,但我需要一直做这项工作

更新:

最终解决方案

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/

【问题讨论】:

  • 后台任务CPU重吗?

标签: node.js express


【解决方案1】:

问题在于您导出 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:对象不是函数

【讨论】:

  • 感谢“module.exports = Updater;”的提示现在我可以实例化它但我现在的问题是 this.run 函数无法访问 this.array 变量我得到一个“无法调用未定义的方法'forEach'”为什么?
  • 你不使用this.array,你只使用array。除此之外,一旦您修复了对this.emit 的调用将失败,这是由于回调中this 的新绑定。请熟悉this的各种上下文,尤其是常用行var that = this;
  • 现在我将代码编辑为工作最终解决方案!这就是帮助,现在我有一个非常优雅的解决方案。
  • 我现在有一个奇怪的问题,一段时间后间隔不再触发!?为什么会这样?
  • 您应该为此打开一个新问题,因为它与上述无关,否则这些 cmets 中的讨论会变得冗长。
【解决方案2】:

你应该看看Events and EventEmitter

你可以使用你并不真正需要的子进程,因为 JS 是异步的。只需为您的后台进程创建一个函数并将其传递给您的 eventEmitter 对象。您可以使用 setInterval 或 while(true) 循环来持续检查数据更改。当数据发生变化时,调用 eventEmitter.emit('someEvent');这将在您的主要任务中触发一个函数来更新您的 mongoDB。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    相关资源
    最近更新 更多