Я пытаюсь использовать api, чтобы получить текущую стоимость акций и умножить на акции пользователей.

Когда я вызываю маршрут, я получаю пустые данные, а когда я печатаю значение обратного вызова, я получаю пустой массив

 function user_cur_portfolio(port, callback) {
  let portfolio = [];
  port.forEach( (stock) => {
    var ticker = stock.name.toLowerCase();
    alpha.data.quote(`${ticker}`).then(data => {
      var fixed = Number((data['Global Quote']['05. price'] * stock.shares).toFixed(2));
      let curr = {
        name : ticker,
        shares: stock.shares,
        value : fixed
      }
      portfolio.push(curr)
    });
  })
  callback(portfolio)
}
router.get('/portfolio', (req, res, next) => {
  if (req.session.userId !== undefined){

     User.findOne({ _id : req.session.userId }).exec(function (err, user) {
      if (err)
        next(err);

        user_cur_portfolio(user.portfolio, (port)=>{
          console.log(port);

          res.render('portfolio', { portfolio: port, balance: user.balance});
        });    
    })
  } else { 
    res.redirect('/users/login');
  }
});
1
Jarvis 4 Окт 2019 в 09:40

1 ответ

Лучший ответ

Когда я вызываю маршрут, я получаю пустые данные Поскольку alpha.data.quote является асинхронной функцией, а forEach - функцией синхронизации, вы не получите data в переменной port.

Так что лучший способ обойти это - использовать async await со всеми синхронными функциями, чтобы они вели себя как async

async function user_cur_portfolio(port) {
  let portfolio = [];
  await Promise.all(
    port.map(async stock => {
      var ticker = stock.name.toLowerCase();
      const data = await alpha.data.quote(`${ticker}`);
      var fixed = Number((data['Global Quote']['05. price'] * stock.shares).toFixed(2));
      let curr = {
        name: ticker,
        shares: stock.shares,
        value: fixed
      };
      portfolio.push(curr);
    })
  );
  return portfolio;
}

router.get('/portfolio', (req, res, next) => {
  if (req.session.userId !== undefined) {
    User.findOne({ _id: req.session.userId }).exec(async function(err, user) {
      if (err) next(err);
      const port = await user_cur_portfolio(user.portfolio);
      console.log(port);
      res.render('portfolio', { portfolio: port, balance: user.balance });
    });
  } else {
    res.redirect('/users/login');
  }
});
1
Ashh 4 Окт 2019 в 09:33