如何在节点js中简化它

时间:2015-04-24 08:51:34

标签: javascript node.js

我试图让它简单地同步在函数之前开始并在函数之后结束的连接字符串。请参阅代码段并简化输出,如:

<start_xml>
<products>
    <proudct_name>Product1</product_name>
    <proudct_name>Product2</product_name>
    <proudct_name>Product3</product_name>
</products>
<companies>
    <company_name>Product1</company_name>
    <company_name>Product2</company_name>
    <company_name>Product3</company_name>
</companies>
</start_xml>

任何肯定的回复都将受到赞赏。

var mysql = require('mysql');
var connection = mysql.createConnection({
      host     : 'localhost',
      user     : DB_USER,
      password : DB_PASS,
      database : DB_NAME,
});

connection.connect();

var query = connection.query('SELECT * FROM tbl_product limit 0,3');

var str = '<start_xml>';

str += '<products>';

query.on('result', function (row) {
    str += '<product_name>' + row.product_name + '</product_name>';
});

str += '</products>';

str += '<companies>';

var query1 = connection.query('SELECT * FROM tbl_employee limit 0,3');
query1.on('result', function (row) {
    str += '<company_name>' + row.company_name + '</company_name>';
});
str += '</companies>';

str = '</start_xml>';

console.log(str);

2 个答案:

答案 0 :(得分:2)

更新到上次编辑,但以这种方式同步代码,称为回调地狱是不好的做法。更好地使用promisesasync。 您可以传递一个回调函数来查询和迭代它,如下所示:

initWithString

更多信息在documentation

答案 1 :(得分:1)

首先,您必须记住这些查询将同时运行,因此您必须在进行第二次查询之前等待第一个查询结束(但效率低下),或编写一个函数一旦完成,收集结果。

一旦你习惯了稍微不同的思考方式,第二种方法就相当容易了。

connection.connect();

var productsFinished = false;
var productsQuery = connection.query('SELECT * FROM tbl_product limit 0,3');
var productsStr = '';
productsQuery.on('result', function (row) {
    str += '<product_name>' + row.product_name + '</product_name>';
});

productsQuery.on('end', function() {
  productsFinished = true;
  complete()  
})

var companiesFinished = false;
var companiesStr = '';
var companiesQuery = connection.query('SELECT * FROM tbl_employee limit 0,3');

companiesQuery.on('result', function (row) {
    companiesStr += '<company_name>' + row.company_name + '</company_name>';
});

companiesQuery.on('end', function() {
  companiesFinished = true;
  complete();
});


var complete = function(){
  if(productsFinished && companiesFinished){
    var str = '<start_xml>';
    str += '<products>';
    str += productsStr;
    str += '</products>;

    str += '<companies>';
    str += companiesStr;
    str += '</companies>;

    str += '</start_xml';

    console.log(str);
  }
}

请注意,您还必须在两个查询中监听end事件,以了解所有行何时已经返回。