【发布时间】:2012-07-15 21:42:11
【问题描述】:
function indexArticles(callback) {
fs.readdir("posts/", function(err, files) {
async.map(files, readPost, function(err, markdown) {
async.map(markdown, parse, function(err, results) {
async.sortBy(results, function(obj, callback) {
callback(err, obj.date);
}, function(err, sorted) {
callback( {"articles": sorted.reverse()} );
});
});
});
});
}
我正试图弄清楚如何让这个更漂亮——正如你所知道的,我正在使用 caolan 的异步库,但我不确定要使用哪个控制流结构。例如,如果我使用 async.waterfall 似乎会产生更多代码,每个步骤都必须包装在一个匿名函数中。例如,这只是带有瀑布的嵌套版本的前两行:
function indexArticles(callback) {
async.waterfall([
function(callback) {
fs.readdir("posts/", function(err, files) {
callback(err, files)
})
},
function(files, callback) {
async.map(files, readPost, function(err, markdown) {
callback(err, markdown)
})
}])
}
您将如何改进?
如果有一种方法不仅可以从左侧部分应用参数,那么我可以看到这样做,例如,
function indexArticles(callback) {
async.waterfall([
async.apply(fs.readdir, "posts/"),
async.apply(async.map, __, readPost),
async.apply(async.map, __, parse),
// etc...
])
}
【问题讨论】:
-
虽然
waterfall最终可能会包含更多字符,但我认为它最终会更具可读性。另请查看apply以帮助处理所有这些匿名函数。 -
你能看一下我刚刚发布的瀑布示例并告诉我我做得对吗?
标签: node.js asynchronous callback