Ir ao conteúdo
  • Cadastre-se

Javascript console.log vem antes do retorno da função


Posts recomendados

Eu estou escrevendo uma aplicação que utiliza a API do Spotify, via HTTP, sem nenhuma biblioteca, dividi o meu código em dois arquivos, um módulo onde está todo o processo de requisição do token e outro arquivo ao qual vai o código principal, estou usando o módulo Axios para fazer as requisições HTTP, mas estou com um problema, no meu código, no arquivo main.js primeiramente eu chamo a função que está no módulo que me retorna o token e logo em seguida dou um console.log nesse token para verificar se está tudo correto, mas quando eu rodo o código o console.log do token vem primeiro sem absolutamente nada e depois vem o console.log de dentro da função token, era para essa ordem ser contrária, o que eu posso fazer para corrigir isso? Eu suponho que tenha algo haver com async e promises, não tenho muito conhecimento, segue abaixo os dois códigos:

 

request_token.js

 

const axios = require('axios')

exports.token = function(client_id, client_secret) {
    
    let token = ''

    const url_to_get_token = 'https://accounts.spotify.com/api/token'

    const data_to_get_token = {
        grant_type: 'client_credentials',    
        client_id: client_id,
        client_secret: client_secret
    }

    const config_to_get_token = {
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        }
    }

    axios.post(url_to_get_token, data_to_get_token, config_to_get_token)
        .then(response => {
            console.log("Response:", response.data)
            token = response.data.access_token
        })
        .catch(error => {
            console.log('Error in request:', error)
        })


    
    return token
}

 

main.js

 

const request_token = require('./request_token')
require('dotenv').config()

const client_id = process.env.CLIENT_ID
const client_secret = process.env.CLIENT_SECRET

const token = request_token.token(client_id, client_secret)

console.log(token)

 

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois...
  • 3 semanas depois...

Opa, você encontrou o problema na propria descrição desse tópico!

 

A função do axios está sendo executada "em paralelo" ao return token, não está esperando o axios executar para seguir com o return, você pode seguir com o código da seguinte maneira:

    
	// colocar await antes de chamar o axios.post!
	await axios.post(url_to_get_token, data_to_get_token, config_to_get_token)
        .then(response => {
            console.log("Response:", response.data);
            return response.data.access_token; // retornar o token assim que receber na requisição
        })
        .catch(error => {
            console.log('Error in request:', error)
			return null; // retornar nulo, caso a requisição tenha falhado
        })

 

Uma coisa a se notar, você tem que definir a função agora, como sendo async. Então vai fazer da seguinte forma:

 

exports.token = function async(client_id, client_secret) {}

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!