如何从一系列级联异步代码返回值

时间:2015-03-24 13:02:29

标签: javascript node.js asynchronous restify node-mssql

我需要一些关于如何重新/写入特定于db的级联代码(回调)的建议,以便我可以有效地将值返回给底层的if / else。

我正在使用restify,db lib是node-mssql(繁琐)。

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);
}

我已经审核了建议的重复内容,虽然我认为,我理解这个问题,但我无法找到最简洁的方法(让所有人都这么做)。

1 个答案:

答案 0 :(得分:0)

如何使用Promise s?

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); });
    });
  }
}