我在解决来自 for 循环的多个承诺时遇到问题。我对 js 还很陌生,我知道我的代码的这一部分有点乱。我正在尝试从多个来源收集财务数据;yfapi 和我的数据库然后将其清理为我的应用程序将接受的格式。
我需要调用一个在 for 循环内返回承诺的函数。特别是
for(let quote of response)
循环。我正在调用getShares()
它返回一个承诺并将其分配给promise
. 我在 for 循环中记录了 promise 并将其推送到promises
. 日志上写着 promise 。但是,当我promises
在 for 循环之外记录数组时,它是空的。Promise.all(promises) 没有解决,因为 promises 是空的。
我相信我遇到了某种异步问题。我在这里先向您的帮助表示感谢!
这是代码:
//get all transactions by owner join with traditional
//get all transactions by owner join with crypto
//stringify 10 tickers at a time
//loop through each array of 10
//loop through each ticker
//query yfapi
//update price in the db
//sanitize data
app.get("/aaron", (req, res) => {
let result = {};
// let promises = [];
getTradTransactions("Aaron").then((data) => {
let transactionsFull = data;
getCryptoTransactions('Aaron').then((data)=>{
transactionsFull = transactionsFull.concat(data)
let tickersFull = Array.from(
new Set(transactionsFull.map((transaction) => transaction.ticker))
);
let tickers = splitTickers(tickersFull);
for (let array of tickers) {
let tickerString = array.join(",");
fetchData(tickerString)
.then((data) => {
let response = data.data.quoteResponse.result;
for (let quote of response) {
let { symbol, regularMarketPrice, shortName, quoteType } = quote;
updatePrice(symbol, regularMarketPrice, shortName, quoteType);
//****let promise = (getShares(symbol, quoteType).then((data)=>{****
// let shares = data[0].totalShares
let transactions = transactionsFull.filter(
(el) => el.ticker === symbol
);
for (let i = 0; i < transactions.length; i++) {
transactions[i] = _.omit(transactions[i], [
"date",
"owner",
"created_at",
"updated_at",
"crypto_id",
"traditional_id",
"description",
]);
}
result[symbol] = {
price: regularMarketPrice,
name: shortName,
// shares,
transactions: transactions,
};
// }))
// console.log(promise)
// promises.push(promise)
}
})
// console.log('promises', promises)
// Promise.all(promises)
.then(() => res.status(200).send(result))
.catch((err) => res.status(400).send(err));
}
})
});
});
和getShares():
function getShares(symbol, quoteType) {
let ticker = symbol
let table = "";
quoteType === "CRYPTOCURRENCY" ? (table = "crypto") : (table = "traditional");
return knex(table)
.select('totalShares')
.where({ ticker })
.then((data) => data);
}