![](/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.