我在理解nodejs上的异步方法时遇到问题。
我的控制器中有一段代码:
app.get(basePath, function (req, res, next) {
model.generateDB(function (modelErr, modelRes) {
if (modelErr) console.log('Error: ' + modelErr);
next(res.send(modelRes));
});
});
此模型的代码片段:
generateDB: function (next) {
BDManager.query(
'INSERT INTO tableName' +
'(field1, field2) VALUES ("a", "b")',
function (err, res) {
next(err, res);
});
}
数据库管理器的这段代码
query: function (sql, next) {
var con = mysql.createConnection(config.MySQL);
con.query(sql, function (err, res) {
if (err) next(err, null);
next(null, res);
});
con.end();
}
对我来说很好。问题是,我怎么可能有多个查询,它们是模型中只有一个控制器调用的响应,如示例(不起作用):
BDManager.query(
'INSERT INTO tableName' +
'(field1, field2) VALUES ("a", "b")',
function (err, res) {
next(err, res);
});
BDManager.query(
'INSERT INTO tableName' +
'(field1, field2) VALUES ("a", "b")',
function (err, res) {
next(err, res);
});
BDManager.query(
'INSERT INTO tableName' +
'(field1, field2) VALUES ("a", "b")',
function (err, res) {
next(err, res);
});
这个想法可以是获取一系列错误和响应,但我不知道在所有查询完成后如何发送它。我尝试了使用.then,但似乎不起作用(使用.then时出现的错误是“cannotuse then on null”)。
另一个解决方案是将多个查询合并到一个查询中,但我尝试了“;”而且对我不起作用。
1条答案
按热度按时间fcy6dtqo1#
所以这是使用回调(.then是用于承诺)。您可以在它周围创建一个promise Package 器,允许您对它进行promisis,然后您可以等待它们或使用promise.all,如果您想并行运行它们的话。
例如:
关于这一点,您可能应该通过参数化输入插入值。您的sql库应该支持这一点
错误也会导致拒绝。如果您想捕获这些错误并将它们推送到一个数组中,也可以使用.catch处理程序来完成。
如果您不使用async/await或兼容的node版本,还可以执行以下操作:
同样的,这将给你一系列的回应,对于你传递给promise.all的任何承诺。
有很多关于如何使用承诺和它们如何工作的文章,但这应该能让你开始。