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

Como pegar o resultado de uma promise?

Olá a todos, estou com um problema pois não estou conseguindo pegar o resultado de uma função que retorna uma promise, já tentei utilizando async await e o método then, porem não retorna nada e também não da log algum de erro.

Se alguém poder me ajudar como faço para atribuir o retorno dessa função para uma variavel agradeço, valeu.

async function returnKeywordsFromWatsonIBM(phrase) {
  return new Promise(() => {
    nlu.analyze(
      {
        text: phrase,
        features: {
          keywords: {},
        },
      },
    )
      .then((response) => {
        try {
          const keywords = response.result.keywords.map((keyword) => keyword.text);
          console.log(keywords); // Irá Imprimir as keywords normalmente...
          return keywords;
        }
        catch (error) {
          console.log('Error: ', error);
        }
      })
      .catch((err) => {
        console.log('error2', err);
      });
  });
}

let myKeyWords = returnKeywordsFromWatsonIBM('This is my phrase and i need to broken it in keywords, arg!');

console.log('Using nothing: ', myKeyWords);  // Imprime normalmente a Promise

myKeyWords.then((values) => {
  console.log('Using then() : ', values);  // Não ira imprimir nada
});
2 respostas

Olá, Denis!!!

Você colocou uma Promise dentro de outra; e a Promise de fora (aquela que você criou com o new Promise(...) nunca teve uma função resolve() chamada, então ela nunca devolve nada para um .then() encadeado a ela.

Usando o new Promise(...), sua função devia ser escrita assim:

async function returnKeywordsFromWatsonIBM(phrase) {
  return new Promise((resolve, reject) => {
    resolve(
      nlu.analyze(...)
      .then(...)
      .catch(...);
    )
  });
}

De qualquer forma, esta Promise de fora não é necessária. O próprio .then() retorna uma Promise que é resolvida com o valor que você retornou dentro do .then(). Então, uma forma mais simples de escrever sua função seria:

async function returnKeywordsFromWatsonIBM(phrase) {
  return nlu.analyze(...)
    .then(...)
    .catch(...);
}

Solução completa:

async function returnKeywordsFromWatsonIBM(phrase) { 
  return nlu.analyze(
    {
      text: phrase,
      features: {
        keywords: {},
      },
    },
  )
  .then((response) => {
    try {
      const keywords = response.result.keywords.map((keyword) => keyword.text);
      console.log(keywords); // Irá Imprimir as keywords normalmente...
      return keywords;
    }
    catch (error) {
      console.log('Error: ', error);
    }
  })
  .catch((err) => {
    console.log('error2', err);
  });
}

let myKeyWords = returnKeywordsFromWatsonIBM('This is my phrase and i need to broken it in keywords, arg!');

console.log('Using nothing: ', myKeyWords);  // Imprime normalmente a Promise

myKeyWords.then((values) => {
  console.log('Using then() : ', values);  // Não ira imprimir nada
});
solução!

Valeu Pablo era isso mesmo o problema, tava quebrando a cebeça já que não tenho muito experiência com Node, valeu mesmo.