user6332379
user6332379

Reputation:

Call another function inside fetch .then - Javascript

I'm fairly new with ES6 (used to work that part with Jquery and the so called callback hell). I got this code (working):

    feti(api_login, tudo);

    function feti(caminho, dados) {
      fetch(caminho, {
      method: 'POST',
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify(dados)
      })
      // captura o erro 
      .then(erroAPI)
      // converte o sucesso em JSON
      .then(response => response.json())
      // disponível para uso
      .then((data, outraFunc) => {
        resposta = data.qscoluna;
        porTod(resposta);
      });
    }
    
    function porTod(valor){
      let api_login_suc = valor[0];
      salvaTudo(api_login_suc);
    }

First function is the one using fetch (feti), and the second one uses the response from first function (porTod).

In my site, I use lots of API calls, so I would like to make the "feti" function an reusable function. The question is: how can I make it acessible from a second function, without calling the second function inside the first (as I'm doing right now?)? If i just try to return the result from fetch and use it in the second function, I got a undefined response, as expected. I believe some kind of promise would be ideal, but I couldn't find any similar question to my problem, and I'm stuck. If someone can point me in the right direction, it would be nice. Just an "search this" would help a lot!

Upvotes: 3

Views: 3584

Answers (1)

Bergi
Bergi

Reputation: 664538

Just return the promise that you want to have processed:

function feti(caminho, dados) {
  return fetch(caminho, {
    method: 'POST',
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(dados)
  })
  // captura o erro 
  .then(erroAPI)
  // converte o sucesso em JSON
  .then(response => response.json())
}

Then instead of calling only feti(api_login, tudo); do

feti(api_login, tudo).then(data => {
  const resposta = data.qscoluna;
  porTod(resposta);
});

Upvotes: 2

Related Questions