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
您无法直接从异步函数返回值.承诺通常用于这种情况.您返回一个承诺,以后可以调用该承诺.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)
| 归档时间: |
|
| 查看次数: |
457 次 |
| 最近记录: |