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

时间:2017-03-27 15:55:33

标签: 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 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());
});

1 个答案:

答案 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)拒绝承诺。

有关详细信息,请参阅:

文档: