Javascript Node.js模块同步到异步

Javascript Node.js模块同步到异步,javascript,node.js,Javascript,Node.js,我有一个简单的Node.js模块,它获取一个Handlebar模板目录,编译它们,然后导出一个键入名称的对象: 'use strict'; var fs = require('fs'), path = require('path'), handlebars = require('handlebars'), templateDir = __dirname + '/templates/', templates = {}; fs.readdirSync(templateDir)

我有一个简单的Node.js模块,它获取一个Handlebar模板目录,编译它们,然后导出一个键入名称的对象:

'use strict';

var
  fs = require('fs'),
  path = require('path'),
  handlebars = require('handlebars'),
  templateDir = __dirname + '/templates/',
  templates = {};

fs.readdirSync(templateDir).forEach(function (file) {
  templates[path.basename(file, path.extname(file))] =
    handlebars.compile(fs.readFileSync(templateDir + file));
});

module.exports = templates;
因此,在其他模块中,我可以:

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

templates[SOME_TEMPLATE]({ ... });
不过,我正在努力研究如何异步实现这一点,特别是如何在混合中使用发射器导出

var emitter = require('events').EventEmitter;

module.exports = function (callback) {
  emitter.on('templates-compiled', function () {
    callback(templates);
  });

  callback();
};

fs.readdir(templateDir, function (err, files) {
  if (!err) {
    files.forEach(function (file) {
      fs.readFile(templateDir + file, function(err, data) {
        if (!err) {
          templates[path.basename(file, path.extname(file))] =
            handlebars.compile(data);

          if (files[files.length - 1] === file) {
            emitter.emit('templates-compiled');
          }
        } else {
        }
      });
    });
  } else {
  }
});

以下是对上述内容的修改:

var EventEmitter=require('events')。EventEmitter;
var path=require('path');
var fs=需要('fs');
module.exports=函数(dir,回调){
var emitter=neweventemitter();
var模板={};
emitter.on('templates-compiled',函数(t){
回调(null,t);
});
发射器.on('templates-error',函数(e){
撤回(e);
});
fs.readdir(dir,函数(err,文件){
如果(!err){
forEach(函数(文件){
fs.readFile(path.join(dir,file),函数(err,data){
如果(!err){
//注意:我只是在这里调用toString()-在这里编译
模板[path.basename(文件,path.extname(文件))]=data.toString();
如果(文件[files.length-1]==文件){
emit('templates-compiled',templates);
}
}否则{
emit('templates-error',err);
}
});
});
}否则{
emit('templates-error',err);
}
});
};

但是,您可能希望查看如何使用或减少。

出现了什么错误?为什么要异步执行此操作?同步加载配置很好。您可能应该看看承诺。使用
EventEmitter
并不是最好的方法。就像@Bergi提到的那样,您不应该使用事件进行流控制。异步模块或承诺就是您要寻找的。谢谢各位@Bergi,你的第一句话很好。我在寻找一种使其异步的方法,但这种情况并不适合它。