0

我在解决来自 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);
}
4

0 回答 0