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

NODEJS Retornar Promise de forma correta

Boa tarde, como posso retornar o promise após o loop? segue o codigo abaixo. PS: Sei que o local do return resolve está incorreto, não sei o que fazer.

Estou usando mysql.

_getDBClientName(db) {
    return new Promise((resolve, reject) => {
      db.map(db => {
        this._db.query(
          `SELECT NOME FROM ${db.db}.reg_0000`,
          (error, results, fields) => {
                //resolve está aqui não consigo retornar 
                //os valores desse loop e depois retornar o resolve =(
            return resolve({
              database: db.db,
              nome: results[0].NOME
            });
          }
        );
      });
    });
  }
9 respostas

Fala ai Brendo, tudo bem? Na verade o resolve não vai ser retornado e sim chamado.

O resolve é uma função que quando chamado irá resolver a Promisse com a situação resolvida, sinal que tudo deu certo.

Logo, a função .then será chamado e como primeiro parâmetro da função de callback você pode receber as informações que passou para a função resolve.

No caso:

new Promise(resolve => resolve([1,2,3]))

Como primeiro parâmetro da função passada para o .then você pode acessar o array de números:

minhaPromise.then(array => console.log(array))

Espero ter ajudado.

Obrigado pela resposta, mas não é bem isso que preciso. Preciso que meio que uma variável global dentro da função para fazer outra coisa com o resultado. =/ não sei como porque eu declaro o var mas ele não passa o valor

Desculpa mas eu não entendi Brendo, consegue passar mais detalhes da sua necessidade?

Fico no aguardo.

Opa, tudo bem rs não sei como explicar... Vou tentar detalhar.

Existe um sistema chamado Sped Fiscal (EFD Contribuições), eu conectei o modulo mysql instalado no node com o banco de dados desse Sped. A situação é que cada cliente é um banco de dados diferente mais parece um multi-tenant (mas não é pois o sistema é apenas de leitura).

NODE.JS eu fiz uma query para retornar os bancos de dados contidos ali,

let query = "SELECT DISTINCT TABLE_SCHEMA as 'db' FROM  INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA LIKE '%bd%'"

Funciona beleza, porém, eu não consigo retornar o nome do cliente que está dentro de cada banco de dados... entao eu criei uma segunda query. SELECT NOME FROM bancodedados.tabela1 ... funciona se eu definir a tabela uma por uma ... não funciona dentro do loop.

segue link da imagem do código completo http://prntscr.com/pbadq9

por algum motivo eu não sei como retornar valores separados de cada query sem chamar calback... pesquisei e falaram algo como async no mysql.query.... não entendi nada.

Lembrando, eu quero fazer um loop do _listDatabase e retornar com os nomes de cada cliente com o _getDBClientName

UP UP UP UP UP

solução!

Fala ai Brendo, tudo bem? Desculpa a demora, estava corrido por aqui, vamos lá:

Dei uma olhada no seu SpedDao e vi que para cada necessidade você tem uma função, show de bola.

Minha sugestão: Na função listaBancos você faz a junção dos dados através do async/await e não .then, algo assim:

async listaBancos() {
    const bancos = await this._listDatabase()
    const clientes = await this._getDBClientName(bancos)
    return clientes
}

Pode ser que resolva, a ideia é esperar a Promise de cada uma resolver, adiciona em uma variável e passa para a próxima, no fim retorna os resultados.

Dá uma olhada nesse artigo:

https://medium.com/balta-io/nodejs-async-await-21ca3636252a

Talvez faça mais sentido para você.

Abraços e bons estudos.

Muito obrigado! Resolvido!

Este foi o resultado final! Encontrei uma solução interessante ali no _getDBClientName. Eu precisava gerar um resultado para cada passada no loop, então criei um array de promises e retornei tudo junto com o Promise.all(), apesar de achar que isso sobrecarrega o banco de dados executando varias consultas rápidas...

Segue documentação

class SpedDao {
  constructor(database) {
    this._db = database;
  }

  async _getDBClientName(db) {
    var output = [];
    await db.map(db => {
      output.push(
        new Promise((resolve, reject) => {
          this._db.query(
            `SELECT NOME FROM ${db.db}.reg_0000`,
            (error, results, fields) => {
              return resolve({
                database: db.db,
                nome: results[0].NOME
              });
            }
          );
        })
      );
    });
    return Promise.all(output).then(function(values) {
      return values;
    });
  }

  _listDatabase() {
    return new Promise((resolve, reject) => {
      this._db.query(
        "SELECT DISTINCT TABLE_SCHEMA as 'db' FROM  INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA LIKE '%bd%'",
        (error, results, fields) => {
          return resolve(results);
        }
      );
    });
  }

  async listaBancos() {
    const bancos = await this._listDatabase();
    const clientes = await this._getDBClientName(bancos);

    return clientes;
  }
}

module.exports = SpedDao;

Boa Brendo, é como eu gosto de dizer: "Na maioria das vezes vamos ter mais de uma solução para dado um problema'.

Fico feliz por ter encontrado a sua.

Abraços e bons estudos.