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

Cod*_*tor 1 javascript asynchronous node.js

我有一个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);
    });
}
Run Code Online (Sandbox Code Playgroud)

我想知道data当我从外面调用这个函数时如何访问该对象

 var data = GetPoints(ibmdb, dbConnection, msisdn);
Run Code Online (Sandbox Code Playgroud)

当我这样做时,值正确 console.log

lag*_*lex 6

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

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
});
Run Code Online (Sandbox Code Playgroud)

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

注意:虽然我不愿意,因为如果你使用MySQL与该promisification可能是一个有点棘手:1,2.但是现在我已经添加.promisifyAll了它似乎多余的地方,因为它可能不止一次被执行,但希望蓝鸟的宣传足够聪明来处理这个问题.尽管如此,如果您能够更有效地实现promisify,您可以删除冗余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        
})
Run Code Online (Sandbox Code Playgroud)