发出自定义事件

Emitting custom event

本文关键字:事件 自定义      更新时间:2023-09-26

我正在我的一个nodejs模块中使用我的自定义Yeoman生成器编程。我编写了一个适配器来替换默认的终端适配器。问题是,

  • 当我使用emit方法触发自定义事件时,我无法 在我的模块中侦听该事件。它没有被解雇。
  • 即使end事件侦听器也不会被解雇。

请让我知道我在这里错过了什么,

下面是我的模块代码,

'use strict';
var fs = require('fs');
var path = require('path');
var MyOwnAdapter = require('./MyOwnAdapter');
var adapt = new MyOwnAdapter();
var env = require('./generator-myframewrk/node_modules/yeoman-generator')(null, {}, adapt);
env.register(path.resolve(__dirname, './generator-myframewrk'), 'myframewrk');
exports.run = function (options, answers) {
    var obj = {};
    adapt.setAnswers(answers);
    process.chdir(options.projdir);
    env.on("end", function(){
        this.log("Even this is not getting called !!!"); //not coming here
    }.bind(this));
    env.on("alldone", function(){
        this.log("Everything is done (including Bower install)");  //not coming here
        obj.cb();
    }.bind(this));
    env.run('myframewrk', function(){
        this.log('ran yo myframewrk, But bower install might be pending'); //coming here
    });
    return {
        done: function (cb) {
            obj.cb = cb;
        }
    };
};

下面是我的生成器代码,

var MyframewrkGenerator = yeoman.generators.Base.extend({
    init: function () {
        this.pkg = require('../package.json');
        this.on('end', function () {
            if (!this.options['skip-install']) {
                this._installBower();
            }
        });
    },
    _installBower: function () {
        this.log("Running bower install...");
        /*reads bower.json and installs*/
        bower.commands.install([], {}, {directory : "./"}).on('error', function (error) {
            this.log("BOWER error::");
            this.log(JSON.stringify(error));
        }.bind(this)).on('log', function (log) {
            this.log("BOWER LOG::"); // coming here
        }.bind(this)).on('end', function (installed) {
            this.log("BOWER END::"); // coming here
            this.emit("alldone");   // my custom event
        }.bind(this));
    },
    askFor: function () { ...
我从

this.on('end', function () {});中取出_installBower方法,并使其成为单独的异步函数。这工作正常。我不再需要自定义事件了!

感谢。。。

bowerInstallHelper: function(){
        if (!this.options['skip-install']) {
            var cb = this.async();
            this._installBower(cb);
        }
    }