在Node.js中处理多个I/O操作的模式
Pattern for dealing with multiple I/O operations in Node.js
假设我有一个用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,但答案不需要使用它们。
您可以将这些错误捕获器设置为单行:
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)
}))
})
}
或者类似的
相关文章:
- 如何使jQuery插件函数可调用以供独立使用,而不在集合上操作
- jQuery菜单应保持操作模式
- 流星技术/模式,用于等待数据库变量更改,然后在 in 之后执行某些操作
- 什么's在Observables(angular2)中操作数据的模式
- 解除模式引导程序后的操作
- 防止对模式保存执行双重操作
- 如何同时显示模式和执行操作
- 在调用操作之前显示模式引导
- 从模式引导程序调用操作
- jQuery/javascript DTD模式操作
- 确认模式按钮 asp.net 的操作
- 在js模式窗口中为下一步添加操作
- 如何为引导模式窗口指定主要和次要操作
- 引导模式显示和隐藏在操作中
- 如何防止播放和暂停点击操作在jwplayer5视频,只有当设置为全屏模式
- 在Node.js中处理多个I/O操作的模式
- 用于管理多个异步JavaScript操作的设计模式
- 轨道:don't在模式操作/提交后刷新页面
- 字符串操作:如何在 / / 模式中添加变量
- Q模式用于许多排队操作