javascript - 解决 Node.js 类初始化器上的回调 hell

标签 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.
};

该 block 中的代码需要延迟,直到数据库返回结果,即 token 。 然后就可以进行进一步的操作了。

我不知道如何等待代码。

自从我尝试过:

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

失败了。因为 tamejs 不允许您在那里放置关键字“await”。

我也使用bluebirdasyncawait库,但是,很难压平整个 block 并在类初始化时“等待”,尤其是第 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

要布局回调,您可能还需要查看 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);
};

关于javascript - 解决 Node.js 类初始化器上的回调 hell ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25562763/

相关文章:

angularjs - 我需要什么用于Web服务器开发的NodeJS工具(框架,IDE等)?为什么?

jQuery $.animate() 多个元素但只触发一次回调

javascript - jS居中功能不适用于页面加载中的一个元素,只需调整大小

javascript - 在 Google Apps 脚本中将数组输入 Math.Max

javascript - 通过 "MATCH (n) DETACH DELETE n"运行 "neo4j-driver"不起作用

jquery - JavaScript : How can i get a key value inside an array of a JSON object

javascript - for 循环内的闭包 - 以循环变量作为参数的回调

javascript - 在数组中查找值

javascript - Sequelize 将传递的日期对象转换为本地日期

javascript - 使用 NodeJS 以 C# 格式访问服务器的 API session 时出现问题