首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Nodejs中从mySQL获取数据时如何从异步/等待函数中获取返回值

在Nodejs中从mySQL获取数据时如何从异步/等待函数中获取返回值
EN

Stack Overflow用户
提问于 2019-06-01 11:34:46
回答 1查看 2.2K关注 0票数 0

我从DB中获取一些exchange数据,然后提取不同交换的名称,然后再转到MYSQL查询中,从不同的表中获取数据。

我面临的问题是异步等待不返回值,而只是返回允诺{ }。

下面是我正在尝试的代码,想知道我哪里出错了。

代码语言:javascript
复制
//Function that fetches the exchanges from DB

const getExchange = () => {
        return new Promise((resolve, reject) => {
            db.connection.query(`
            SELECT  *
            FROM,
            (
            SELECT
                exchange,
                COUNT(pair) as noOfMarkets
                FROM ticker_data

        ) as t
            `, (err, resp) => {
                if (!err) {
                    resolve(resp)
                } else {
                    reject(err)
                }
            })
        })
    }


// push unique exchanges to an array.
const getExchangesData = async () => {
    const allExchanges = await getExchanges();

    let exchanges = []
    allExchanges.forEach(item => {
        let exchange = {
            exchange: item.exchange
        }
        exchanges.push(exchange)
    })
    return await exchanges
}


// mapping through an array of exchanges and passing to DB query to get data from the DB.

const getSingleExchange = async () => {
    const exchanges = await getExchangesData()
    await Promise.all(exchanges.map(async (item) => {
        db.connection.query(`
        SELECT
       exchange_rank,
       name
       volume24hUSD
       (
            SELECT
            volume24hUSD as tradingVolYesterday
            FROM exchanges
            WHERE name = '${item.exchange}'
            AND createdAt >= now() -interval 1 day
            AND createdAt <  now() -interval 1 day + interval 120 second
            LIMIT 1
       ) volumeDay1
FROM exchanges
WHERE name = '${item.exchange}'
        `, (err, resp) => {
            if (!err) {
                console.log(resp) // getting all the values

                let volData = {
                     name: resp[0].name,
                     exchange_rank: resp[0].exchange_rank,
                     icon: resp[0].icon
                 }
                 return volData 
            }
        })
    }))
}


const data = getSingleExchange()
console.log(data) // returning Promise { <pending> } 

编辑

在作出答案所建议的改变后,我仍然有一个问题:

代码语言:javascript
复制
//Function that fetches the exchanges from DB

const getExchange = () => {
        return new Promise((resolve, reject) => {
            db.connection.query(`
            SELECT  *
            FROM,
            (
            SELECT
                exchange,
                COUNT(pair) as noOfMarkets
                FROM ticker_data

        ) as t
            `, (err, resp) => {
                if (!err) {
                    resolve(resp)
                } else {
                    reject(err)
                }
            })
        })
    }


// push unique exchanges to an array.
const getExchangesData = async () => {
    const allExchanges = await getExchanges();

    let exchanges = []
    allExchanges.forEach(item => {
        let exchange = {
            exchange: item.exchange
        }
        exchanges.push(exchange)
    })
    return await exchanges
}


    // mapping through an array of exchanges and passing to DB query to get data from the DB.

const getSingleExchange = async () => {
    const exchanges = await getExchangesData()
    await Promise.all(exchanges.map((item) => {
        return new Promise((resolve, reject) => {
            db.connection.query(`...`, (err, resp) => {
                if (!err) {
                    resolve(resp)
                } else {
                    reject(err)
                }
            }).then(resp => {
                console.log(resp)
                let volData = {
                    name: resp[0].name,
                    exchange_rank: resp[0].exchange_rank,
                    icon: resp[0].icon
                }
                return volData
            })
        })
    }))

}

getSingleExchange().then(data => {
    console.log(data)
});

我现在得到了这个错误:

(节点:30583) UnhandledPromiseRejectionWarning: TypeError:db.connection.query(...).then不是函数 准承诺(/getExchanges.js:217:16) 新承诺() Promise.all.exchanges.map (/getExchanges.js:145:16) Array.map () getSingleExchange (/getExchanges.js:144:33)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-01 11:47:00

这一部分的主要问题是:

代码语言:javascript
复制
await Promise.all(exchanges.map(async (item) => {

map回调没有返回任何内容,也没有await,因此使用async是没有意义的。

相反,删除async

代码语言:javascript
复制
await Promise.all(exchanges.map((item) => {

..。并在回调函数中返回一个承诺,就像在第一个函数中所做的那样:

代码语言:javascript
复制
    return new Promise((resolve, reject) => {
        db.connection.query(`...`), (err, resp) => {
            if (!err) {
                resolve(resp)
            } else {
                reject(err)
            }
        })
    }).then(resp => {
        console.log(resp)
        let volData = {
             name: resp[0].name,
             exchange_rank: resp[0].exchange_rank,
             icon: resp[0].icon
         }
         return volData 
    });

编写一个促进query的泛型函数将使您受益,这样您就不必为所需的每一个查询执行new Promise-thing。

最后,不能期望同步地获得异步结果:async函数不同步返回异步结果,而是返回承诺。因此,您的最后一行(主要代码)仍应等待。所以要么这样做:

代码语言:javascript
复制
(async () => {
    const data = await getSingleExchange()
    console.log(data)
})(); // immediately executing (async) function expression

或者:

代码语言:javascript
复制
getSingleExchange().then(data => {
    console.log(data)
});

注意:在第二个函数中执行return await exchanges是没有意义的(exchanges不是一个承诺),所以您可以只做return exchanges

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56406351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档