[英]How do I return this object, instead of logging it?
我有一个静态网站生成器,我想为其列出templates/partials
文件夹中的所有可用部分。 我需要将部分列表的格式设置为以下类型的对象:
var partials = {
'header': 'partials/header', // from './templates/partials/header.html'
'footer': 'partials/footer' // from './templates/partials/footer.html'
};
我已经按照以下示例将以下节点脚本放在一起:
'use strict';
/**
* Dependencies
*/
var fs = require("fs");
var path = require("path");
var p = 'templates/partials';
/**
* Scan folder and return object with partials
*/
fs.readdir(p, function (err, files) {
var obj = {};
if (err) {
throw err;
};
for (var i = 0; i < files.length; i++) {
obj[path.basename(files[i], '.html')] = 'partials/' + files[i];
};
console.log(obj);
});
从项目的根目录执行时,它记录:
{ footer: 'partials/footer.html',
header: 'partials/header.html' }
这很好,但是我想返回它,而不是记录它。 我也觉得我写的东西很笨拙。 所以我的问题是,如何返回对象,以及如何使它更坚固?
您应该提供一个回调函数:
function readfiles(callback) {
fs.readdir(p, function (err, files) {
var obj = {};
if (err) {
throw err;
};
for (var i = 0; i < files.length; i++) {
obj[path.basename(files[i], '.html')] = 'partials/' + files[i];
};
callback(obj);
});
}
这将被如下使用:
readfiles(function(files) {
// Do stuff with files here.
});
回调函数允许IO异步完成; 这通常可以大大提高代码的速度,因为它不需要等待IO完成。 在这种情况下,它不是那么有用,但是回调模式在Node.js中非常常见,因此在这里使用它是一个好习惯。
var results = fs.readdir(p, function(err, files) {
var obj = {};
if (err) {
throw err;
};
for (var i = 0; i < files.length; i++) {
obj[path.basename(files[i], '.html')] = 'partials/' + files[i];
};
// derectly deal with it here
deal(obj);
});
或者您可以考虑异步:
async.waterfall([
function(cb) {
fs.readdir(p, cb)
},
function(files, cb) {
for (var i = 0; i < files.length; i++) {
obj[path.basename(files[i], '.html')] = 'partials/' + files[i];
}
cb(null, obj);
}
],
function(err, obj) {
if (err) {
throw err;
}
// do somethin else
}
);
或者您想要同步返回:
var files = fs.readdirSync(p);
for (var i = 0; i < files.length; i++) {
obj[path.basename(files[i], '.html')] = 'partials/' + files[i];
};
// here's your obj
obj;
请阅读文档以获取更多详细信息: http : //nodejs.org/api/fs.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.