簡體   English   中英

如何從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可能是一個有點棘手: 12 但是,到目前為止,我在.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM