Javascript .on()侦听器中Node.js回调的返回值

Javascript .on()侦听器中Node.js回调的返回值,javascript,node.js,Javascript,Node.js,我得到了回调的异步特性。我只是在寻找一种模式,它将返回的值呈现给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

我得到了回调的异步特性。我只是在寻找一种模式,它将返回的值呈现给
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());
});
这是行不通的:

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;
}
这是因为
返回retret
中的值之前,code>将运行。你能回报的只是一个承诺,就像这样:

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);
        });
    });
}
CanIConnectToTheDB().then(result => {
  // you have result here
}).catch(error => {
  // you have error here
});
请参见,另请参见:

请记住,当您的函数返回承诺时,您必须像这样使用它:

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);
        });
    });
}
CanIConnectToTheDB().then(result => {
  // you have result here
}).catch(error => {
  // you have error here
});
或:

或者-仅当您在具有
async
关键字的函数中时:

try {
  let result = await CanIConnectToTheDB();
  // you have result here
} catch (error) {
  // you have error here
}
注意-在您的
canconnecttothedb()
中,您应该使用
resolve(value)
来解析承诺,并使用
rejest(error)
来拒绝承诺

有关更多信息,请参阅:

文件:


“我了解回调的异步特性”-不,你不了解。也许你的理解不够深入。对于所有异步函数,只有两件事是正确的。(1) 他们不会马上接到电话。(2) 由于1,您无法将其结果返回给启动异步进程的函数。没有太多的深度。您提供了异常值。谢谢你的精心安排和完整的回答。我知道我必须错过一些更好的方法。我不使用node.js day int和day out。也不是javascript。所以我没有考虑承诺。但现在我明白了这是完全有道理的。这在我看来造成了一个更大的上下文问题。在连接测试之后,我想实际查询并希望得到一行或多行,但从来没有保证。调用方法以执行查询最合适的位置在哪里?在router.get()中,但它没有连接。在.on('connect')中?那么,我如何返回承诺,或者在不影响承诺的情况下返回行?在OnConnect_CanIConnectToTheDB()中?在实现了所显示的内容之后,您将如何查询数据库?一个单独的方法创建它自己的连接?第二个连接不能保证。谢谢。我将在.on('connect')中嵌套一个新的“rows”承诺,这样我就可以将rows result/s(或缺少)附加到连接承诺返回值的返回值中。