我正在使用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行。
如何处理这个问题?
答案 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);
};