我正在使用 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”。
我也使用bluebird,asyncawait库,但是,很难压平整个 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/