lus*_*uso 24 javascript mysql node.js
我是事件/回调样式编程和NodeJS的新手.我正在尝试实现一个使用node-mysql模块提供ddbb数据的小http服务器.
我的问题来自查询结构.由于经常有查询需要先前查询的结果才能运行,因此我无法同时(异步)运行所有这些查询,因此我不得不等待一些结果.
我的第一种方法是同时运行所有非依赖查询,然后循环,直到所有这些查询都设置了一个标记,说我已经完成了所以我可以继续使用依赖(同步),但我不知道这是否是正确的方法.
像这样的东西:
function x(){
    var result_for_asynch_query_1 = null
    var result_for_asynch_query_2 = null
    mainLoop(){
        // call non-dependant query 1
        // call non-dependant query 2
        // loop until vars are != null
        // continue with queries that require data from the first ones
    }
}
//for each browser request
httpServer{
     call_to_x();
}.listen();
这样我可以在最终结果中节省一些时间,因为我不会以串行方式等待所有响应,而只是等待最长的响应.
有一个共同的方法来做到这一点?我没有遵循任何设计模式?
pro*_*ths 43
人们应该避免厄运的金字塔:
var express = require('express');
var Q = require('Q');
var app = express();
app.get('/',function(req,res){
    var mysql      = require('mysql');
    var connection = mysql.createConnection({
        host     : 'localhost',
        user     : 'root',
        password : ''
    });
    connection.connect();
    function doQuery1(){
        var defered = Q.defer();
        connection.query('SELECT 1 AS solution',defered.makeNodeResolver());
        return defered.promise;
    }
    function doQuery2(){
        var defered = Q.defer();
        connection.query('SELECT 2 AS solution',defered.makeNodeResolver());
        return defered.promise;
    }
    Q.all([doQuery1(),doQuery2()]).then(function(results){
        res.send(JSON.stringify(results[0][0][0].solution+results[1][0][0].solution));
        // Hint : your third query would go here
    });
    connection.end();
});
app.listen(80);
console.log('Listening on port 80');
此样本显示的结果取决于2个独立的计算值.在doQuery1和doQuery2中查询这些值中的每一个.它们按顺序执行,但是异步执行.
接下来你可以看到Q.all(...哪个基本上称为"then"回调成功.在该回调中,计算完成.
使用promises(详细信息:Github Q:Javascript和维基百科的承诺)允许使您的代码更清晰,分离计算和处理结果并移动事物.
看看添加"doQuery3"作为计算的先决条件是多么容易!
并将"package.json"铃声吼叫为示例代码:
{
    "name": "hello-world",
    "description": "hello world test app",
    "version": "0.0.1",
    "private": true,
    "dependencies": {
        "express": "3.2.0",
        "q": "0.9.3",
        "mysql":"2.0.0-alpha7"
    }
}
And*_*rov 11
尝试以其他方式思考(异步流程howtonode.org上有很好的介绍)
var db = get_link_or_pool();
do_queries( callback ) {
    db.query(sql1, function(err, res1) {
        if (err) {
             callback(err);
             return;
        }
        // use res1 ...
        db.query(sql2, function(err, res2) {
             if (err) {
                 callback(err);
                 return;
             }
             callback(null, res2); // think 'return'
        }
    });
}
request_handler(req) {
    do_queries( function(err, result) {
        if(err)
            report_error(err);
        else
            write_result(req, result);
    });
}