解决node.js类初始值设定项上的回调地狱

solve callback hell on class initializer for node.js

本文关键字:地狱 回调 js node 解决      更新时间:2023-09-26

我正在使用npm包"mssql"为了打开连接。我必须做:

var getOneToken = function (callback) {
    var token = "";
    var connection = new sql.Connection(dbConfig, function(err){   //<-----line 3
        if(err) console.log(err);
        var sqlrequest = new sql.Request(connection);
        sqlrequest.query('select top 1 [accessToken] from AccessToken', function(err, recordset){
            if(err) console.log(err);
            token = recordset[0]['accessToken'];
            connection.close();
            callback(token);
        })
    });
    //how to await the whole block at the top and prevent early execution of code afterwards.
};

此块中的代码需要延迟,直到数据库返回结果,即令牌。然后可以进行进一步的操作。

我不知道如何等待代码。

自从我尝试过:

connection = await { new sql.Connection(dbConfig, defer (var err)) }  

它失败了。因为tamejs不允许将关键字'await'放在那里。

我也使用bluebirdasyncawait库,但是,很难压平整个块和类初始化时的"等待",特别是对于第3行。

如何处理这个问题?

function sqlConnect(dbConfig, cb) {
  var conn = new sql.Connection(dbConfig);
  conn.connect(function (err) {
    cb(err, conn);
  });
}

用法:

sqlConnect(dbConfig, function (err, conn) {
  // do your stuff here
});

或者使用tamejs:

var err, conn;
await { sqlConnect(dbConfig, defer(err, conn); }
// do your stuff here

要布局回调,您可能还需要查看异步


更新:如果您只想避免回调链,则不需要提取新的函数来建立连接。相反,你可以这样重写你的函数:

var getOneToken = function (dbConfig, cb) {
    var err, recordset;
    var token = "";
    var conn = new sql.Connection(dbConfig);
    await { conn.connect(defer(err)); }
    if (err) {
        console.log(err);
        cb(token);
        return;
    }
    var request = new sql.Request(conn);
    await { request.query('select top 1 [accessToken] from AccessToken', defer(err, recordset)); }
    if (err) {
        console.log(err);
    } else {
        token = recordset[0]['accessToken'];
    }
    conn.close();
    cb(token);
};