代码模式相当于在Node JS中的阻塞条件下链接if / elseif?

时间:2013-12-05 16:49:04

标签: node.js design-patterns if-statement asynchronous callback

我想在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?

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

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

3 个答案:

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