![](/img/trans.png)
[英]How to return a value from a async function in array.map in javascript?
[英]How to access a return value from a javascript async function
我有一个Node.js函数可以从数据库表中获取一些值
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
时,该值正确显示
您不能直接从异步函数返回值。 通常会在这种情况下使用承诺。 您返回一个promise,以后可以将其称为.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
});
此外,Bluebird具有一个promisify
函数,它将一个异步函数(需要一个回调)变成一个返回Promise的函数。 它使上面的代码更加简单:
注意:虽然我不愿意,因为如果你使用MySQL与该promisification可能是一个有点棘手: 1 , 2 。 但是,到目前为止,我在.promisifyAll
处添加了它,因为它可能会执行.promisifyAll
,因此看起来似乎是多余的,但希望bluebird的promisification足够聪明来处理此问题。 但是,如果您设法更有效地进行承诺,则可以删除冗余的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
})
您在SQL查询异步执行后提供的回调函数。 与其尝试在函数之外获取数据,不如尝试在内部执行任何操作。 请记住,您可以创建另一个函数,并将其与数据一起调用以继续工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.