Javascript 如何从一系列级联异步代码返回值
我需要一些关于如何重新/编写特定于db的级联代码回调的建议,以便能够有效地向底层if/else返回值 我使用的是restify,db库节点mssql非常单调乏味Javascript 如何从一系列级联异步代码返回值,javascript,node.js,asynchronous,restify,node-mssql,Javascript,Node.js,Asynchronous,Restify,Node Mssql,我需要一些关于如何重新/编写特定于db的级联代码回调的建议,以便能够有效地向底层if/else返回值 我使用的是restify,db库节点mssql非常单调乏味 function authenticate(req, res, next) { var auth = req.authorization; var err; if (auth.scheme !== 'Basic' || ! auth.basic.username || ! auth.basic.password) {
function authenticate(req, res, next) {
var auth = req.authorization;
var err;
if (auth.scheme !== 'Basic' || ! auth.basic.username || ! auth.basic.password) {
authFail(res);
err = false;
} else {
var sql = "SELECT ..."
var connection = new mssql.Connection(config.mssql, function(err) {
if (err) {console.log(err);}
var request = connection.request();
request.query(sql, function(err, recordset) {
if (err) {console.log(err);}
if (recordset.length === 0) {
authFail(res);
err = false; // <--- I need to be able to return this
} else {
authSuccess();
}
});
});
}
next(err);
}
我已经审阅了建议的副本,虽然我认为,我理解这个问题,但我无法找出最干净的方法让它发挥作用。使用承诺如何
可能是神奇的复制品…它很有效。我读过关于承诺作为级联回调的解决方案。promise是可以在任何地方/时间使用的,还是必须得到db lib节点mssql的支持?@schliden是的,库必须支持它们才能开箱即用。
function authenticate(req, res, next) {
var auth = req.authorization;
if (auth.scheme !== 'Basic' || ! auth.basic.username || ! auth.basic.password) {
authFail(res);
next(false);
} else {
var sql = "SELECT ..."
var connection = new mssql.Connection(config.mssql, function(err) {
if (err) {console.log(err);}
var request = connection.request();
request.query(sql).then(function(recordset) {
if (recordset.length === 0) {
authFail(res);
return false; // <--- return this
} else {
authSuccess();
}
}).catch(function(err) {
console.log(err);
return err;
}).then(function(err) { next(err); });
});
}
}