假设我有一个用Node.js编写的CMS应用程序,它将数据保存在Redis数据库中。当此应用程序创建新内容时,它应该递增id计数器,将新id添加到ide列表,然后使用内容设置新哈希。我现在要做的是创建一个执行此执行的函数。这个函数(我们称之为createArticle()
)会有一个回调并执行增量。执行增量后,回调函数会将其推送到ID列表中。之后,另一个回调将创建哈希。哈希创建回调会将作为参数传递的函数调用到createArticle()
:
function createArticle(title, content, callback) {
var client = redis.createClient();
client.incr("idCounter", function(err, id) {
if (err) return callback(err, data);
client.lpush("articleIds", id, function (err, data) {
if (err) return callback(err, data);
var key = "article:"+id;
client.hmset(key, "title", title, "content", content, callback);
});
});
}
我会或多或少地使用这个函数(在本例中使用Express):
app.post('/createarticle', function(req, res) {
var title = req.body.article.title,
content = req.body.article.content;
createArticle(title, content, function(err, data) {
if (err) return res.render('error', { status: 500, message: 'Internal Server Error' });
res.render('index', { status: 200, message: 'Article created!' });
});
});
但是,这段代码看起来有点麻烦。这是要走的路。或者有更好的方法来执行一系列I / O步骤吗?我在我的例子中使用了Express和Redis,但答案不需要使用它们。
答案 0 :(得分:1)
您可以将这些错误捕获器单行化:
function createArticle(title, content, callback) {
var client = redis.createClient()
client.incr("idCounter", function(err, id) {
if (err) return callback(err, data)
client.lpush("articleIds", id, function (err, data) {
if (err) return callback(err, data)
var key = "article:"+id
client.hmset(key, "title", title, "content", content", callback)
})
})
}
您可以使用帮助程序来处理错误:
function noError(errorCb, cb) {
var slice = Array.prototype.slice
return function (err) {
var currentCb = err ? errorCb : cb
currentCb.apply(this, slice.apply(arguments, err?0:1)
}
}
function createArticle(title, content, cb) {
var client = redis.createClient()
client.incr("idCounter", noError(cb, function(id) {
client.lpush("articleIds", id, noError(function (data) {
var key = "article:"+id
client.hmset(key, "title", title, "content", content", callback)
}))
})
}
或类似的东西。