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

时间:2014-08-29 06:27:48

标签: javascript node.js jquery-callback

我正在使用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'。

我也使用 bluebird asyncawait 库,但是很难将整个块压平 并且在课堂上“等待”初始化,尤其是第3行。

如何处理这个问题?

1 个答案:

答案 0 :(得分:1)

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

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


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

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