如何从javascriptasynchronous函数访问返回值

我有一个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时,这个值是正确的

您不能直接从asynchronous函数返回值。 承诺一般是用这种情况。 你返回一个后来可以调用的承诺,然后检索所述的值。

 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函数,它把一个asynchronous函数(需要callback)转换成一个返回Promise的函数。 它使上面的代码更简单:

注意:虽然我不情愿,因为如果你使用的是promisification可能有点棘手的MySQL: 1,2 。 但现在我已经添加了.promisifyAll ,看起来可能是多余的,因为它可能会被执行不止一次,但希望蓝鸟的promisification是足够聪明来处理这个。 尽pipe如此,如果你设法更有效地promisten你可以删除冗余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查询后执行的callback函数asynchronous执行。 不要试图将这些数据放在函数之外,你应该尝试执行你需要做的任何事情。 请记住,您可以创build另一个function,并用数据调用它来继续工作。