Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Problema para trabalhar com padrão PROMISE

Bom dia.

Tenho um exemplo de código abaixo, onde estou alterando o valor de uma variável dentro de um padrão Promise. Neste código, porém, o padrão Promise é executado depois do console.log. Como eu posso resolver este impasse?

'use strict'

//Requires
const ari = require('ari-client');
const config = require('./config');

var a = '';

var b = listBridge(a);
console.log("A variavel a vale: " + b);

function listBridge(a){

    //Connect
    ari.connect(global.ASTERISK_URL, global.ASTERISK_USER, global.ASTERISK_PASSWORD)
    .then(ari => {
        config.log('Conectado com sucesso.');
        a = 5;
        return a;
    })
    .catch(err => {
        config.log("teste");
        return;
    });
}
3 respostas

Olá Guilherme, tudo bem com você?

Realmente sempre que tentarmos dar um console.log após uma promise teremos esse problema, e para recorrer eu acredito que a forma mais eficiente seria recorrer ao async e await, vou te dar um exemplo:

Vou criar uma função bem simples que executa uma promise e altera um valor passado, da maneira que você fez

function execPromise(valor){
    return Promise.resolve()
    .then( _ => {
        valor = 50;
        console.log(`Valor do 2 dentro da Promise ${valor}`)
        return valor
    })
    .catch( e => console.log(e))
}

Agora irei criar uma função main que irá chamar a nossa função:

function main(){
    const valor1 = 30;
    const valor2 = execPromise(valor1);

    console.log(valor2);
}
main()

O resultado disso é algo parecido como:

Promise { <pending> }
Valor do 2 dentro da Promise 50

Ou seja, o nosso console.log executou primeiro

Agora vou dizer que a minha função main() é assíncrona:

async function main(){ 

E que ela deve esperar a execução da promise da seguinte maneira:

async function main(){
    const valor1 = 30;
    const valor2 = await execPromise(valor1);

    console.log(valor2);
}

main();

Agora que estamos dizendo que temos que esperar a função execPromise terminar para continuar a execução do nosso programa o resultado no console será:

Valor do 2 dentro da Promise 50
50

Vou deixar um link que fala um pouco mais sobre esse recurso do javascript: Async/ Await

Compreendeu? Abraços e Bons Estudos!

Boa noite! Muito obrigado pelo esclarecimento!! Se não for pedir demais, gostaria que você desse uma olhada no código que vou colocar aqui. Tem alguma coisa de diferente do que o que você me explicou pra ele? Ainda estou recebendo o resultado Promise { }...

axios = require('axios');

main();

function main(){
    var teste = getData();
    teste.then();
    console.log('teste 1: ' + teste);
    return teste;
}
function getData() {
    axios.get('http://192.168.100.9:8088/ari/endpoints?api_key=snepari:sneppass')
        .then((response) => {
            //console.log(response.data);
            return response.data;
        });
}

Desde já agradeço pela atenção! Estou travado neste impasse há dias.

solução!

Opa Guilherme, tudo bem com você?

Então, faltou você definir a sua função main como assíncrona, vou te dar um exemplo usando o axios, ok?

const axios = require('axios');

async function main(){
    const dadosDaAPI = await getData();
    console.log(dadosDaAPI)
}

Da mesma forma veja que antes de function eu declarei que é async e coloco await onde eu quero que o meu código espere!

Agora a função getData()

function getData(){
    return axios.get("http://dummy.restapiexample.com/api/v1/employees")
        .then( response => response.data)
        .catch( err => console.log(err))
}

Não podemos esquecer de colocar o returnpara ter acesso aos nosso dados e em nosso main não precisamos de teste.then(); pois já terminou a nossa Promise :)

Testa um pouco esse código com o console.log para você entender um pouquinho mais :)

Abraços e Bons Estudos!