es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Utilizando variables globales en node js en diferentes funciones asíncronas.

Estoy tratando de familiarizarme más con las mejores prácticas en NodeJS. Actualmente, tengo una función asíncrona que extrae datos de un sitio web y almacena los valores recuperados en un objeto. Lo que me gustaría hacer es usar el valor en una función diferente para extraer datos de Yahoo Finance y recuperar valores específicos. No estoy seguro de cómo pasar este valor a las otras funciones. Estoy pensando en posiblemente establecer el valor, que se pasa a otras funciones, como una variable global. ¿Sería esa la mejor práctica en el mundo de la programación de NodeJS? Cualquier opinión o consejo sería útil. A continuación se muestra el código que tengo actualmente:

const cheerio = require('cheerio');
const axios = require("axios");

async function read_fortune_500() {
  try {
    const { data } = await axios({ method: "GET", url: "https://en.wikipedia.org/wiki/List_of_S%26P_500_companies", })
    const $ = cheerio.load(data)
    const elemSelector = '#constituents > tbody > tr > td:nth-child(1)'
    const keys = ['symbol']

    $(elemSelector).each((parentIndex, parentElem) => {
      let keyIndex = 0
      const stockObject = {}
      if (parentIndex <= 9){
      $(parentElem).children().each((childIndex, childElem) => {
        const tdValue = $(childElem).text()

        if (tdValue) {
          stockObject[keys[keyIndex]] = tdValue
        }
      })
      console.log(stockObject)
    }
    })
} catch (err) {
    console.error(err)
  }
}

async function getCurrentPrice() {}

read_fortune_500()
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Generalmente no se recomienda utilizar variables globales en NodeJS. En su lugar, existen diferentes enfoques que se pueden tomar para pasar los datos entre funciones. Una opción es pasar el valor como parámetro a la función que lo necesita. Por ejemplo, podrías modificar el código para llamar a la función getCurrentPrice con el símbolo de la acción como parámetro:

    async function getCurrentPrice(symbol) {
      try {
        const { data } = await axios({ method: "GET", url: `https://finance.yahoo.com/quote/${symbol}` })
        // extraer los datos relevantes de la respuesta
        return datosRelevantes
      } catch (err) {
        console.error(err)
      }
    }
    
    async function read_fortune_500() {
      try {
        // ...
        $(elemSelector).each(async (parentIndex, parentElem) => {
          // ...
          const symbol = stockObject[keys[keyIndex]]
          const currentPrice = await getCurrentPrice(symbol)
          console.log(`Precio actual de ${symbol}: ${currentPrice}`)
        })
      } catch (err) {
        console.error(err)
      }
    }
    
    read_fortune_500()
    

    Alternativamente, podrías extraer la funcionalidad de obtener el precio actual en su propio módulo y utilizarlo como dependencia en ambas funciones. Por ejemplo:

    // getCurrentPrice.js
    const axios = require("axios")
    
    module.exports = async function getCurrentPrice(symbol) {
      try {
        const { data } = await axios({ method: "GET", url: `https://finance.yahoo.com/quote/${symbol}` })
        // extraer los datos relevantes de la respuesta
        return datosRelevantes
      } catch (err) {
        console.error(err)
      }
    }
    
    // readFortune500.js
    const cheerio = require('cheerio')
    const axios = require("axios")
    const getCurrentPrice = require("./getCurrentPrice")
    
    async function read_fortune_500() {
      try {
        // ...
        $(elemSelector).each(async (parentIndex, parentElem) => {
          // ...
          const symbol = stockObject[keys[keyIndex]]
          const currentPrice = await getCurrentPrice(symbol)
          console.log(`Precio actual de ${symbol}: ${currentPrice}`)
        })
      } catch (err) {
        console.error(err)
      }
    }
    
    read_fortune_500()
    

    Este enfoque te permite mantener funcionalidades relacionadas agrupadas y asegura que cada módulo solo tenga acceso a los datos que necesita, sin depender de variables globales.

Comments are closed.