我有一个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
答案 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,那么宣传可能会有点棘手:1,2。但是现在我已经将.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查询异步执行后给出的回调函数。您应该尝试执行内部需要执行的操作,而不是尝试在函数外部获取数据。请记住,您可以创建另一个功能并使用数据调用它以继续您的工作。