我使用以下代码,我需要将其转换为promise并在最后返回包含文件配置的对象, 我应该怎么做?
var Promise = require('bluebird'),
glob = promisifyAll(require("glob")),
fs = Promise.promisifyAll(require("fs"));
module.exports = {
parse: function (configErr) {
glob("folder/*.json", function (err, files) {
if (err) {
return configErr(new Error("Error to read json files: " + err));
}
files.forEach(function (file) {
fs.readFileAsync(file, 'utf8', function (err, data) { // Read each file
if (err) {
return configErr(new Error("Error to read config" + err));
}
return JSON.parse(data);
});
})
})
UPDATE - 在代码中我想从我的节点项目中的特定文件夹中获取json文件并将json内容解析为object
答案 0 :(得分:3)
Promisified函数返回promise,你应该使用那些而不是将回调传递给调用。顺便说一句,你的forEach
循环不能异步工作,你应该使用dedicated promise function。
var Promise = require('bluebird'),
globAsync = Promise.promisify(require("glob")),
fs = Promise.promisifyAll(require("fs"));
module.exports.parse = function() {
return globAsync("folder/*.json").catch(function(err) {
throw new Error("Error to read json files: " + err);
}).map(function(file) {
return fs.readFileAsync(file, 'utf8').then(JSON.parse, function(err) {
throw new Error("Error to read config ("+file+")" + err);
});
});
};
然后,您可以通过.then
附加回调来捕获错误或捕获错误或使用已解析的配置对象数组。
var config = require('config');
config.parse().then(function(cfg) { … }, function onConfigErr(err) { … })