如何从javascript异步函数访问返回值
我有一个Node.js函数从DB表中获取一些值如何从javascript异步函数访问返回值,javascript,node.js,asynchronous,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 W
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);
});
}
我想知道当我从外部调用此函数时,如何访问数据
对象
var data = GetPoints(ibmdb, dbConnection, msisdn);
当我执行
控制台时,值正确。log
您不能直接从异步函数返回值。在这种情况下,通常使用承诺。您返回一个承诺,该承诺可在以后调用。然后
检索所述值
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
函数,该函数将异步函数(接受回调)转换为返回承诺的函数。它使上述代码更加简单:
注意:虽然我不太情愿,因为如果您使用的是MySQL,那么Promission可能会有点棘手:。但现在我添加了.promisifyAll
,它可能看起来是多余的,因为它可能会被执行多次,但希望bluebird的promisification足够聪明来处理这个问题。尽管如此,如果您能够更有效地promisify,您只需删除冗余的promisifyAll
,然后使用X.yyyanc
方法,如下所述:
不能直接从异步函数返回值。在这种情况下,通常使用承诺。您返回一个承诺,该承诺可在以后调用
。然后
检索所述值
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
函数,该函数将异步函数(接受回调)转换为返回承诺的函数。它使上述代码更加简单:
注意:虽然我不太情愿,因为如果您使用的是MySQL,那么Promission可能会有点棘手:。但现在我添加了.promisifyAll
,它可能看起来是多余的,因为它可能会被执行多次,但希望bluebird的promisification足够聪明来处理这个问题。尽管如此,如果您能够更有效地promisify,您只需删除冗余的promisifyAll
,然后使用X.yyyanc
方法,如下所述:
异步执行SQL查询后提供的回调函数。与其尝试在函数外部获取数据,不如尝试在函数内部执行任何需要执行的操作。请记住,您可以创建另一个函数并使用数据调用它以继续您的工作 异步执行SQL查询后提供的回调函数。与其尝试在函数外部获取数据,不如尝试在函数内部执行任何需要执行的操作。请记住,您可以创建另一个函数并使用数据调用它以继续您的工作 没有返回数据不起作用..我确实想在line console.log(数据)之后使用返回数据。但该值似乎仅对内部函数的上下文有效,您指的是异步函数,即
conn.query
的回调函数?不幸的是,你不能。您的数据
仅在该回调内可用。我无法获取数据[0]。指向上下文之外的点?请使用返回值指定一个范围之外的变量。花一点时间检查变量,如果设置了,就做些什么。问题是执行查询后数据可用。但GetPoints在查询启动时返回。所以您可以将数据存储在某个位置,等待查询完成或在回调中使用它。没有返回数据不起作用。.我确实希望在line console.log(data)之后使用返回数据。但该值似乎仅对内部函数的上下文有效,您指的是异步函数,即conn.query
的回调函数?不幸的是,你不能。您的数据
仅在该回调内可用。我无法获取数据[0]。指向上下文之外的点?请使用返回值指定一个范围之外的变量。花一点时间检查变量,如果设置了,就做些什么。问题是执行查询后数据可用。但GetPoints在查询启动时返回。因此,您可以将数据存储在某个位置,等待查询完成或在回调中使用它。Bluebird的promisify
函数可能在这里使用,以避免直接创建新的承诺(这通常是不需要的,而且容易出错)。@MattHamann精彩的一点。我自己也喜欢Promission,但在这种情况下我很不情愿,因为我发现使用MySQL可能有点棘手:。尽管如此,我还是扩展了Promission部分和mysql的相关问题。我还纠正了没有抛出错误的错误(希望这是唯一的错误)。我所能返回的只是promisify对象。Bluebird的promisify
函数可能在这里使用,以避免直接创建新的承诺(通常不需要,而且容易出错)。@MattHamann极好的观点。我自己也喜欢Promission,但在这种情况下我很不情愿,因为我发现使用MySQL可能有点棘手:。尽管如此,我还是扩展了Promission部分和mysql的相关问题。我还纠正了没有抛出错误的错误(希望这是唯一的错误)。我能返回的只是promisify对象。