[英]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.