2014-04-01 166 views
0

我正在使用我的自定义yeoman生成器programmatical在我的一个nodejs模块中。我写了一个适配器来替换默认的TerminalAdapter。 的问题是,发送自定义事件

  • 当我使用的触发方法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() { ... 

回答

0

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

Thx ...

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