回调或承诺永远不会通过EventEmitter完成

时间:2015-03-28 19:20:46

标签: javascript node.js events

我使用node&#39的EventEmitter

为我的应用程序编写了一个简单的事件调度程序

我有很多活动,一切都很好,除了一个,我不知道为什么承诺或回调永远不会完成

这是调度员的代码

var EventEmitter = require('events').EventEmitter,
    RequireTree = require('require-tree'),
    _ = require('lodash');

module.exports = {
    init: function(options) {

        var self = this;

        _.extend(options, {
            excludes: []
        });

        if (!options.path) {
            throw new Error('You must specify the `path` option');
        }

        self.Emitter = self.Emitter || new EventEmitter();

        // Require all files in this directory
        RequireTree(options.path, {
            filter: filterModels,
            each: loadModels
        });

        function filterModels(filename) {
            return options.excludes.indexOf(filename) === -1;
        }

        function loadModels(model) {
            Object.keys(model).forEach(function(key) {
                self.Emitter.on(key, model[key]);
            });
        }

        return this;
    }
};

当我的应用程序启动时,我打电话给调度员

dispatcher.init({
    path: __dirname + '/events'
});

有问题的事件

events/send_emails.js

var Mandrill = require('mandrill-api/mandrill').Mandrill;

modules.exports = {
  'send:email': function() {
    var mandrill = new Mandrill('apikey', true);
    var message = {
       html: '<h1>Hello email</>',
       from_email: 'info@example.com',
       from_name: "Example",
       subject: "Example mail",
       to: [{
         email: 'my@email.com'
       }],
            headers: {
              'Reply-To': "info@example.com"
            }
    };

    var cb = function(a) { console.log("PRINT SOME", a);  }

    mandrill.messages.send({message: message, async: false, ip_poll: 'Main Pool'}, cb, cb);
  }
};

当我的应用程序发出send:mail事件时,会调用该函数,但PRINT SOME消息永远不会显示在控制台中

我在一个简单的脚本中测试函数send:mail

测试/ index.js

var events = require('./events');

events['send:email']();

调用命令

$ node test/index.js

和工作!!!!我在控制台上看到了消息PRINT SOME

我不明白我的代码与事件调度程序有什么问题

我有其他事件,他们编写文件,在数据库上存储记录,并且必定会调用其他API

另外,我写了一个粗略的方法,使用superagent作为回报承诺

var request = require('superagent-bluebird-promise');

request
  .post('https://mandrillapp.com/api/1.0/messages/send.json')
  .send({message: ...}).then(..).catch(...);

.then.catch方法从未被称为

0 个答案:

没有答案