代码模式相当于链接如果/ elseif在阻塞条件在节点JS?

我想在Node.JS中写入以下同步代码的等价物:

function(param) { if(condition1(param)) {f(param);} else if(condition2(param)){g(param);} else if(condition3(param)){h(param);} ... } 

在条件的validation可能做一些数据库,文件系统,甚至HTTP I / O; 所以不应该在这样的同步代码中运行。

简单但肮脏的解决scheme:可以像回答这个问题一样链接callback如何在Node JS中编写一个非阻塞的if语句?

但是,当条件数量很多时,很容易变得难以理解和难以修改(例如改变条件的顺序)。

有没有一个很好的模式,可以用来保持这样的代码整洁?

你可能也想看看asynchronous库 。

asynchronous库有一个function,可以帮助这个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); } } ]); 

(这个答案只是增加了更多的细节, 这个答案提到asynchronous和你的评论提及series 。)

就个人而言,我使用Streamline在我的(当然是小的)node.js项目中取得了巨大的成功。 正如你可以从他们的页面看到的,它允许你转换代码

 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"); }