繁体   English   中英

Node.js异步多个查询

[英]Node.js asynchronous multiple queries

所以我试图在客户端给定的列表上使用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)
    });
}

让我们使用异步功能。 首先,让我们说明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个查询,这可能会运行得更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM