我基本上有两个功能:
loadPost(name)
loadPosts()
显然loadPosts()
来电loadPost(name)
。
两者都返回最终的html。
理想情况下,我应该异步编写它。
问题是:我不知道如何异步,因为我需要等到文件被完全读取才能继续。
这是我的同步解决方案:
function loadPost(name){
var post = fs.readFileSync("_posts/"+name,'utf8');
// Convert Markdown to html
var marked = mark(post);
return marked;
}
function loadPosts(){
var files = fs.readdirSync("_posts/");
var html;
for(var i = 0; i < files.length ; i++){
html += loadPost(files[i]);
}
return html;
}
答案 0 :(得分:1)
您需要使用async.js套餐,让您的生活更轻松。
function loadPost(name, callback) {
fs.readFile("_posts/+"name,{encoding:'utf8'},function(err, data) {
if(err) return callback(err);
// convert markdown to html
var marked = mark(post);
callback(false, marked);
});
}
function loadPosts(cb) {
fs.readdir("_posts/", function(err, dir) {
if(err) return cb(err);
var html;
async.eachSeries(dir, function(one, callback) {
loadPost(one, function(err, post) {
if(err) return cb(err);
html += post;
callback(false);
});
},
// final callback
function(err) {
if(err) { console.log(err); cb(true); return; }
cb(false, html);
});
});
}
答案 1 :(得分:1)
像这样的东西,没有必要的第三方库。真的很简单。
/*jshint node:true */
function loadPosts(callback) {
'use strict';
var allHtml = ''; //Declare an html results variable within the closure, so we can collect it all within the functions defined within this function
fs.readdir("_posts/", function (err, files) {
function loadPost(name) {
fs.read("_posts/" + name, 'utf8', function (err, data) {
allHtml += mark(data);//Append the data from the file to our html results variable
if (files.length) {
loadPost(files.pop()); //If we have more files, launch another async read.
} else {
callback(allHtml); //If we're out of files to read, send us back to program flow, using the html we gathered as a function parameter
}
});
}
loadPost(files.pop());
});
}
function doSomethingWithHtml(html) {
'use strict';
console.log(html);
}
loadPosts(doSomethingWithHtml);