2

以下のコードのように、クエリをスローするたびに、ネストの深さが1つずつ増えます。クエリをアクションに含まれない関数として定義する方法を知っていれば、コードの可読性が向上します。

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

ネストの抑制に役立ついくつかのノードフロー制御モジュールを調べることができます。私は非同期と呼ばれるものが好きです。ネストされたコードをネスト解除するさまざまな方法を提供します。

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関数のリストを取得し、各関数の結果を次の関数に渡し、最後に2番目のパラメーターである別の関数を呼び出して最終結果を返します。結果は、それらを返すことによってではなく、コールバック関数によって渡されます。asyncまた、ノードで使用されるいくつかの機能を並列、直列、およびさまざまな異なる一般的なパターンで実行することもサポートします。

于 2012-06-10T12:37:26.403 に答える