多个查询的节点MySql回调

时间:2015-07-21 04:33:01

标签: javascript mysql node.js callback

我试图创建逻辑以将行添加到我在MySql数据库上创建的新表时遇到了问题。添加行时,我需要查询数据库4次以检查其他行,然后将正确的值添加到新行。我正在使用node.js和mysql模块来完成此任务。编码时遇到了麻烦,代码不会等待4个查询在插入新行之前完成,这样每次都会给出值为0的值。经过一些研究后,我意识到回调功能是有序的,看起来像这样:

var n = 0;
connection.query("select...", function(err, rows){
    if(err) throw err;
    else{
        if(rows.length === 1) ++n;
    }
    callback();
});

function callback(){
    connection.query("insert...", function(err){
         if(err) throw err;
    });
}

注意:选择查询只能返回一个项目,因此if条件不应影响此问题。

一个只有一个查询要等待的回调函数对我来说很清楚,但是我有点迷失了多个查询等待。我唯一的想法是创建另一个在调用回调之前递增的变量,然后在回调函数的参数中传递。然后在回调内部,查询可以用if语句封装,条件是这个变量等于需要调用的查询数,4就我的目的而言。我可以看到这种方法有效但不确定这种情况是否已经内置解决方案,或者是否已经开发出其他更好的解决方案。

2 个答案:

答案 0 :(得分:4)

您需要asynchttps://github.com/caolan/async)。你可以用这个模块做一个非常复杂的逻辑。

var data = {} //You can do this in many ways but one way is defining a global object so you can add things to this object and every function can see it

firstQueryFunction(callback){
    //do your stuff with mysql
    data.stuff = rows[0].stuff; //you can store stuff inside your data object
    callback(null); 
}

secondQueryFunction(callback){
    //do your stuff with mysql
    callback(null);
}

thirdQueryFunction(callback){
    //do your stuff with mysql
    callback(null);
}

fourthQueryFunction(callback){
    //do your stuff with mysql
    callback(null);
}

//This functions will be executed at the same time
async.parallel([
    firstQueryFunction,
    secondQueryFunction,
    thirdQueryFunction,
    fourthQueryFunction
], function (err, result) {
     //This code will be executed after all previous queries are done (the order doesn't matter).
     //For example you can do another query that depends of the result of all the previous queries.
});

答案 1 :(得分:1)

根据Gesper的回答,我建议使用异步库,但是,我建议您并行运行(除非第一个查询的结果用作第二个查询的输入)。

var async = require('async');

function runQueries(param1, param2, callback) {

    async.parallel([query1, query2, query3(param1, param2), query4],
        function(err, results) {
            if(err) {
                callback(err);
                return;
            }

            var combinedResult = {};
            for(var i = 0; i < results.length; i++) {
                combinedResult.query1 = combinedResult.query1 || result[i].query1;
                combinedResult.query2 = combinedResult.query2 || result[i].query2;
                combinedResult.query3 = combinedResult.query3 || result[i].query3;
                combinedResult.query4 = combinedResult.query4 || result[i].query4;
            }
            callback(null, combinedResult);
        });
}


function query1(callback) {
    dataResource.Query(function(err, result) {
        var interimResult = {};
        interimResult.query1 = result;
        callback(null, interimResult);
    });
}

function query2(callback) {
    dataResource.Query(function(err, result) {
        var interimResult = {};
        interimResult.query2 = result;
        callback(null, interimResult);
    });
}

function query3(param1, param2) {
    return function(callback) {
        dataResource.Query(param1, param2, function(err, result) {
            var interimResult = {};
            interimResult.query3 = result;
            callback(null, interimResult);
        });
    }
}

function query4(callback) {
    dataResource.Query(function(err, result) {
        var interimResult = {};
        interimResult.query4 = result;
        callback(null, interimResult);
    });
}

Query3显示使用的参数是否通过&#39;到查询功能。

我确信有人可以向我展示一种更好的方法来结合结果,但这是我迄今为止所提出的最佳方法。使用临时对象的原因是&#34;结果&#34;传递给回调的参数是一个结果数组,很难确定哪个查询结果。

祝你好运。