Возвращаемые значения в асинхронных функциях пусты

#javascript #node.js #asynchronous #async-await

#язык JavaScript #node.js #асинхронный #асинхронное ожидание

Вопрос:

Я вижу, что были и другие сообщения, связанные с этой темой, но я, похоже, не могу найти решение, которое помогло бы моей ситуации. У меня есть две асинхронные функции. Один из них возвращает значение, которое должно использоваться в другой функции. По какой-то причине используемое значение считывается как пустая переменная. Я не знаю, как еще это сделать, но любая перспектива была бы оценена по достоинству.

Код

 var stockSymbol = []; async function read_fortune_500() {  try {  const { data } = await axios({ method: "GET", url: "https://en.wikipedia.org/wiki/List_of_S&P_500_companies", })  const $ = cheerio.load(data)  const elemSelector = '#constituents gt; tbody gt; tr gt; td:nth-child(1)'   $(elemSelector).each((parentIndex, parentElem) =gt; {  if (parentIndex lt;= 9){  $(parentElem).children().each((childIndex, childElem) =gt; {  const tdValue = $(childElem).text()   if (tdValue) {  stockSymbol = tdValue  }  })  console.log(stockSymbol)  }  }) } catch (err) {  console.error(err)  }  return stockSymbol; }  async function collect_stocks(stockSymbol) {  stockSymbol = read_fortune_500()  const stockResult = await yahooStockPrices.getCurrentData(stockSymbol);  console.log(stockResult); }  collect_stocks(stockSymbol)  

Ошибка

 TypeError: Cannot read properties of undefined (reading 'split')  

Если я запущу первую функцию, я смогу записать значения в консоль, поэтому я знаю, что значения там есть, но я не уверен, в чем я ошибаюсь, передавая их второй функции.

Комментарии:

1. stockSymbol = read_fortune_500() lt;- есть нет ожидаем

Ответ №1:

Вы определили read_fortune_500 как асинхронную функцию, поэтому она возвращает обещание. Ты, наверное, хотел await этого collect_stocks .

 async function collect_stocks(stockSymbol) {  stockSymbol = await read_fortune_500()  const stockResult = await yahooStockPrices.getCurrentData(stockSymbol);  console.log(stockResult); }