我从DB中获取一些exchange数据,然后提取不同交换的名称,然后再转到MYSQL查询中,从不同的表中获取数据。
我面临的问题是异步等待不返回值,而只是返回允诺{ }。
下面是我正在尝试的代码,想知道我哪里出错了。
//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> } 编辑
在作出答案所建议的改变后,我仍然有一个问题:
//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)
发布于 2019-06-01 11:47:00
这一部分的主要问题是:
await Promise.all(exchanges.map(async (item) => {map回调没有返回任何内容,也没有await,因此使用async是没有意义的。
相反,删除async
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
});编写一个促进query的泛型函数将使您受益,这样您就不必为所需的每一个查询执行new Promise-thing。
最后,不能期望同步地获得异步结果:async函数不同步返回异步结果,而是返回承诺。因此,您的最后一行(主要代码)仍应等待。所以要么这样做:
(async () => {
const data = await getSingleExchange()
console.log(data)
})(); // immediately executing (async) function expression或者:
getSingleExchange().then(data => {
console.log(data)
});注意:在第二个函数中执行return await exchanges是没有意义的(exchanges不是一个承诺),所以您可以只做return exchanges。
https://stackoverflow.com/questions/56406351
复制相似问题