如何在for循环中多次调用带有多个嵌套mysql查询的函数?

时间:2019-02-26 17:34:19

标签: javascript node.js

我有一个名为foo的函数,该函数使用mysql模块:https://github.com/mysqljs/mysql

fooz = [{query1:'',query2:'',query3:''},{query1:'',query2:'',query3:''},{query1:'',query2:'',query3:''},{query1:'',query2:'',query3:''}]


function foo (query1,query2,query3){ 
var connection = mysql.createConnection(dbconfig);
connection.query(query, function (error, results, fields) {
   connection.query(query2, function (error, results, fields) {
      connection.query(query3, function (error, results, fields) {
      connection.end()


    })
  })
})

然后我有一个for循环,它将多次调用此函数。

    for (i=0;i<fooz.length;i++){foo(fooz[i].query1,fooz[i].query2,fooz[i].query3)}

发生的事情是foo被多次调用,但仅执行其中一个功能,然后停止。我该怎么做才能确保foo函数执行一次以上?谢谢!

2 个答案:

答案 0 :(得分:0)

您可以递归调用for循环。只要确保有退出条件

fooz = [{query1:'',query2:'',query3:''},{query1:'',query2:'',query3:''},{query1:'',query2:'',query3:''},{query1:'',query2:'',query3:''}];

foo(0);
function foo(index) {
    if (index >= fooz.length) {
        return;
    }
    var connection = mysql.createConnection(dbconfig);
    connection.query(fooz[index].query1, function (error, results, fields) {
        connection.query(fooz[index].query2, function (error, results, fields) {
            connection.query(fooz[index].query3, function (error, results, fields) {
                connection.end();
                foo(index + 1);
            })
        })
    });
}

关于这一点的好处是您的查询列表也是非阻塞的。 您可能还需要考虑在调用foo之前打开连接,并在完成迭代后将其关闭。

答案 1 :(得分:0)

如果您这样制作foo

function foo (query1,query2,query3){ 
    var connection = mysql.createConnection(dbconfig);
    function runQuery(query) {
        return new Promise((resolve, reject) => {
            connection.query(query, function (error, results, fields) {
                if (error) reject(error);
                resolve(results);
            })
        })
    }

    return runQuery(query1).then(results => {
        return runQuery(query2);
    }).then(results => {
        return runQuery(query3);
    })
}