我想在Node.JS中写下以下同步代码:
function(param)
{
if(condition1(param)) {f(param);}
else if(condition2(param)){g(param);}
else if(condition3(param)){h(param);}
...
}
条件验证可能在某些数据库,文件系统甚至是http I / O;所以不应该在这样的同步代码中运行。
简单但肮脏的解决方案:可以在问题的答案中链接回调How to write a non-blocking if statement in Node JS?
但是当条件数量很高时,它变得容易理解并且难以修改(例如,改变条件的顺序)。
是否有一个很好的模式可以用来保持这样的代码整洁?
答案 0 :(得分:2)
async库有一个可以帮助解决这个问题的函数series
。以下是使用series
:
async.series([
function(callback) {
if (condition1(param)) {
f(param);
} else { callback(null); }
},
function(callback) {
if (condition2(param)) {
g(param);
} else { callback(null); }
},
function(callback) {
if (condition3(param)) {
h(param);
} else { callback(null); }
}
]);
(此答案只是为this answer mentioning async和your comment mentioning series
添加了更多详细信息。)
答案 1 :(得分:1)
您可能还想查看async library。
答案 2 :(得分:0)
就我个人而言,我已经在我的(通常很小的)node.js项目中使用Streamline取得了巨大的成功。正如您从其页面中看到的那样,它允许您转换代码,如
function archiveOrders(date, cb) {
db.connect(function(err, conn) {
if (err) return cb(err);
conn.query("select * from orders where date < ?", [date], function(err, orders) {
if (err) return cb(err);
helper.each(orders, function(order, next) {
conn.execute("insert into archivedOrders ...", [order.id, ...], function(err) {
if (err) return cb(err);
conn.execute("delete from orders where id=?", [order.id], function(err) {
if (err) return cb(err);
next();
});
});
}, function() {
console.log("orders have been archived");
cb();
});
});
});
}
到
function archiveOrders(date, _) {
var conn = db.connect(_);
conn.query("select * from orders where date < ?", [date], _).forEach_(_, function(_, order) {
conn.execute("insert into archivedOrders ...", [order.id, ...], _);
conn.execute("delete from orders where id=?", [order.id], _);
});
console.log("orders have been archived");
}