如何从javascript异步函数访问返回值

时间:2015-06-27 10:10:34

标签: javascript node.js asynchronous

我有一个Node.js函数来从DB表中获取一些值

var GetPoints = function(ibmdb, dbConnection, msisdn) {
    ibmdb.open(dbConnection, function(err, conn) {
        if (err) {
            //Error
        } else {
            conn.query('SELECT id,msisdn,points FROM t_points WHERE msisdn =' + msisdn, function(err, data) {
                console.log(err);
                if (!err) {
                    conn.close(function(err) {
                        if (!err) {}
                    });
                    consele.log(data);
                    //return data[0].POINTS;
                } else {
                    //Error
                }
            });
        }
        console.log("points" + points);
    });
}

我想知道从外部调用此函数时如何访问data对象

 var data = GetPoints(ibmdb, dbConnection, msisdn);

当我执行console.log

时,值正确显示

2 个答案:

答案 0 :(得分:6)

您无法直接从异步函数返回值。承诺通常用于这种情况。您将返回一个稍后可以调用.then的promise以检索所述值。

var Promise = require('bluebird');
var GetPoints = function(ibmdb, dbConnection, msisdn) {
    // return a Promise
    return new Promise(function(resolve){
        ibmdb.open(dbConnection, function(err, conn) {
            if(err) throw err; // throw the error for it to be caught
            …
            conn.query('SELECT …', function(err, data) {
                if(err) throw err;
                …
                consele.log(data);
                //return data[0].POINTS;
                resolve(data);
}); }); }); }

GetPoints().then(function(data){
    // do something with data
}).catch(function(err){
    // handle err
});

此外,Bluebird有一个promisify函数,可以将异步函数(需要回调)转换为返回Promise的函数。它使上面的代码更简单:

注意:虽然我很不情愿,因为如果您使用MySQL,那么宣传可能会有点棘手:12。但是现在我已经将.promisifyAll添加到了可能看似多余的地方,因为它可能不止一次被执行,但希望蓝鸟的宣传足够聪明来处理这个问题。尽管如此,如果您设法更有效地宣传,您可以删除多余的promisifyAll并使用X.yyyAsync方法,如下所述:

function GetConnection(ibmdb, dbConnection, msisdn){
    Promise.promisifyAll(ibmdb);
    return ibmdb.openAsync();
}

function getData(conn){
    Promise.promisifyAll(conn);
    return conn.queryAsync('SELECT …');
}

GetConnection()
.then(getData)
.then(function(data){
    // do something with data        
})

答案 1 :(得分:0)

SQL查询异步执行后给出的回调函数。您应该尝试执行内部需要执行的操作,而不是尝试在函数外部获取数据。请记住,您可以创建另一个功能并使用数据调用它以继续您的工作。