Node.js异步多个查询

时间:2017-06-27 23:35:34

标签: javascript mysql node.js promise

所以我试图在客户端给出的列表上使用forEach语句获取查询。

获取结果后,将结果推送到数组中,以便将结果检索到客户端(显然在格式化后)。

问题是我有多个异步查询正在使用mysql,我不太确定如何修复它们。

var select = function(list, flag, callback){
list.forEach(function(element){
    if (flag && (element != '')){
        connection.query(sql, function (err, result) {
            if (err) {throw err;}
            callback(result);
        });
    } else if (element != ''){
        connection.query(sql, function (err, result) {
            if (err) {throw err;}
            callback(result);
        });
    }
});
};

我使用以下后解析方法

调用此函数
var results = [];
if (req.body.ip == undefined){
    mysql.select(req.body.field1.split('\r\n'), false, function(result){
        results.push(result);
    });
} else if (req.body.name == undefined){
    mysql.select(req.body.field2.split('\r\n'), true, function(result){
        results.push(result);
    });
}
res.send(results);

我尝试过使用承诺,但由于我之前从未使用过承诺,因此我无法找到合适的方法。

如果有人可以伸出援助之手,我真的很感激!

编辑:固定它!!!!!我用过这个。

enter code herevar select = function(list, flag, callback){
var promises = [];
list.forEach(function(element){
    if (flag && (element != '')){
        promises.push(new Promise(function(resolve, reject){
            connection.query(sql, function (err, result) {
                if (err) {reject(err);}
                resolve(callback(result));
            });
        }));
    } else if (element != ''){
        promises.push(new Promise(function(resolve, reject){
            connection.query(sql, function (err, result) {
                if (err) {reject(err);}
                resolve(callback(result));
            });
        }));
    }
});
return promises;
};

然后像这样的主要代码

var results = [];
if (req.body.ip == undefined){
    Promise.all(mysql.select(req.body.field1.split('\r\n'), false, function(result){
        results.push(result);
    })).then(function(){
        res.send(results)
    });
} else if (req.body.name == undefined){
    Promise.all(mysql.select(req.body.field2.split('\r\n'), true, function(result){
        results.push(result);
    })).then(function(){
        res.send(results)
    });
}

1 个答案:

答案 0 :(得分:0)

让我们使用异步功能。首先,让promisify你的回调函数返回:

const util = require("util");
connection.queryAsync = util.promisify(connection.query);

现在,让我们map列表进入延续状态,以便我们知道他们何时完成 - 承诺只是值+时间,您可以使用以下方式访问该值:

现在,在您的实际代码中将函数标记为async,因此如果它是function foo则需要async function foo,然后我们就可以轻松地使用async-await:

async function select(list, flag) {
  const relevant = list.filter(x => x != "")
  const ps = flag ? list.map(x => connection.queryAsync(x.a)) 
                  : list.map(x => connection.queryAsync(x.b)); // or whatever
  return await Promise.all(ps);
};

然后,在外面

select([...], ...).then(() => console.log("All done!"));

注意:您的问题的真正解决方案很可能在SQL端解决 - 这需要是一个查询而不是N个查询,这些查询可能会运行得更快。