2012-06-10 5 views
2

Каждый раз, когда я бросаю запрос, глубина гнезда увеличивается на единицу, точно так же как и код ниже. Если бы я знал, как определить запрос как функцию не в действии, читаемость моего кода будет увеличиваться.Как прекратить писать код вложенности в node-mysql (node.js, express, mysql)

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

Просто сделайте обработчику с именем функции:

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 
    }); 
} 
+0

Является ли 'клиент' действительно в области обратного вызова? – sarnold

+0

@sarnold: Да, это будет в закрытии функции. – Guffa

+0

Спасибо за объяснение! :) – sarnold

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 также поддерживает одновременное выполнение нескольких функций, а также множество различных шаблонов, используемых в узле.

+0

i c. .. спасибо, я думаю, это действительно поможет –