2

每次我抛出一个查询,嵌套深度都会增加一,就像下面的代码一样。如果我知道如何将查询定义为不在操作中的函数,我的代码的可读性就会提高。

exports.getAll = function (req, res) {

    client.query('SELECT * FROM tag', function (err, result, fields) {
        client.destroy();

        if (err) {
            throw err;
        }

        var tag = result[0].tag;

        client.query('SELECT COUNT(follow_id) AS following_tag_num FROM follow WHERE user_id = ?', [req.session.user.user_id], function (err, result, fields) {
            client.destroy();

            if (err) {
                throw err;
            }

            res.render('hoge', {
                title: 'Welcome to Hoge',
                userInfo: req.session.user,
                tag: tag,
                following_tag_num: result[0].following_tag_num
            });
        });

    });

}
4

2 回答 2

4

只需将处理程序设为命名函数:

client.query(
  'SELECT COUNT(follow_id) AS following_tag_num FROM follow WHERE user_id = ?',
  [req.session.user.user_id],
  handleResult
);

function handleResult(err, result, fields) {
  client.destroy();

  if (err) {
    throw err;
  }

  res.render('hoge', {
    title            : 'Welcome to Hoge',
    userInfo         : req.session.user,
    tag              : tag,
    following_tag_num: result[0].following_tag_num
  });
}
于 2012-06-10T01:23:23.360 回答
3

您可能会查看几个可用于帮助抑制嵌套的节点流控制模块。我喜欢一个叫做async的。它提供了多种方法来取消嵌套代码。

var async = require('async');
async.waterfall([
    function(callback) {
        client.query(sql, callback);
    },
    function(results, callback) {
        // do something with results, then call callback
    }],
    function(err, data) {
        // if any errors occur above, err is not null
        // otherwise 'data' is whatever got passed to the last callback
    });

async.waterfall接受一个函数列表,并将每个函数的结果传递给下一个函数,最后调用第二个参数,另一个函数,最终结果。结果不是通过返回来传递的,而是通过回调函数传递的。async还支持并行、串行运行多个函数,以及 node.js 中使用的各种不同的常用模式。

于 2012-06-10T12:37:26.403 回答