我得到了回调的异步性质。我只是在寻找一种将返回值呈现给console.log("1", ret);
的模式。
或者是否有更好的方法?
这是在.on()中的回调让我失望。
var _Con = require('tedious').Connection;
var _Req = require('tedious').Request;
function OnConnect_CanIConnectToTheDB(err) {
if (err)
return "err, could not connect to db";
else
return "connected to db// ";
}
function CanIConnectToTheDB() {
var ret = "err";
var con = new _Con({ userName: 'bla', password: 'bla', server: 'bla' })
.on('connect', function (err) {
ret = OnConnect_CanIConnectToTheDB(err);
console.log(ret);
});
console.log("1", ret);
return ret;
}
router.get('/', function (req, res) {
res.send(CanIConnectToTheDB());
});
答案 0 :(得分:1)
这永远不会奏效:
function CanIConnectToTheDB() {
var ret = "err";
var con = new _Con({ userName: 'bla', password: 'bla', server: 'bla' })
.on('connect', function (err) {
ret = OnConnect_CanIConnectToTheDB(err);
console.log(ret);
});
console.log("1", ret);
return ret;
}
这是因为return ret;
会在您获得ret
中的值之前运行。所有你能回来的都是一个承诺,就像这样:
function CanIConnectToTheDB() {
return new Promise((resolve, reject) => {
var ret;
var con = new _Con({ userName: 'bla', password: 'bla', server: 'bla' })
.on('connect', function (err) {
ret = OnConnect_CanIConnectToTheDB(err);
console.log(ret);
resolve(ret);
});
});
}
请参阅this answer for more details,另见:
请记住,当你的函数返回一个promise时,你必须像这样使用它:
CanIConnectToTheDB().then(result => {
// you have result here
}).catch(error => {
// you have error here
});
或:
CanIConnectToTheDB().then(result => {
// you have result here
}, error => {
// you have error here
});
或 - 仅当您在具有async
关键字的函数内时:
try {
let result = await CanIConnectToTheDB();
// you have result here
} catch (error) {
// you have error here
}
注意 - 在CanIConnectToTheDB()
内部,您应该使用resolve(value)
来解决承诺,并rejest(error)
拒绝承诺。
有关详细信息,请参阅:
文档: