Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

CallBack de função em Jquery

Como fazer a minha função retornar data apenas dps do resultado de soma?

Percebi que envolve os callbacks, como poderia fazer o callback dessa função em jquery?

Detalhe, isso seria um middleware, recebe a requisição da página, envia para um servidor, capta a resposta e reenvia para o cliente.


//função do middleware

server.route({
    method: "GET",
    path: "/calculadora/{operacao}/{num1}/{num2}", //Pede 3 parametros do lado do cliente
    handler: function (pedido) {
      console.log("iniciando calculo");

      const num1 = parseInt(pedido.params.num1);
      const num2 = parseInt(pedido.params.num2);
      const op = pedido.params.operacao;
      let result;
      console.log(result);
      console.log(op);

      if (op == "soma") {
        result = soma(num1, num2);
      }

      console.log(result);

      var data = {
        resultado: result,
      };

      return data;
    },
  });
};

//Função soma 

let x;
function soma(num1, num2) {
  url = "http://localhost:3000/calculadora/soma/" + num1 + "/" + num2;
  var jqxhr = $.getJSON(url, function () {
    console.log("success");
  })
    .done(function (data) {
      console.log("second success");
      console.log(data.resultado);
      return (x = data.resultado);
    })
    .fail(function () {
      console.log("error");
    })
    .always(function () {
      console.log("complete");
    });
  return x;
}
1 resposta
solução!

Oi Lucas, tudo bem?

Desculpe a demora em retornar.

Pelo que pude entender, você está tentando fazer com que sua função "soma" retorne apenas após receber o resultado da soma, que é feito em outro servidor. Para isso, você está correto em dizer que é necessário utilizar callbacks.

Em resumo, um callback é uma função que é passada como parâmetro para outra função, para que possa ser executada posteriormente, após algum evento específico ocorrer. No seu caso, você precisa passar uma função de callback para a função "$.getJSON" que será executada quando o resultado da soma for retornado.

Vamos ao código:

function soma(num1, num2, callback) {
  url = "http://localhost:3000/calculadora/soma/" + num1 + "/" + num2;
  $.getJSON(url, function (data) {
    console.log("success");
    console.log(data.resultado);
    callback(data.resultado);
  });
}

Aqui, modificamos a função "soma" para receber mais um parâmetro, que é a função de callback que será executada com o resultado da soma. No corpo da função, utilizamos a função "$.getJSON" para fazer a requisição ao servidor e, em seguida, chamamos a função de callback passando o resultado como parâmetro.

Agora, vamos modificar a função do middleware para utilizar essa nova versão da função "soma":

server.route({
  method: "GET",
  path: "/calculadora/{operacao}/{num1}/{num2}",
  handler: function (pedido) {
    console.log("iniciando calculo");

    const num1 = parseInt(pedido.params.num1);
    const num2 = parseInt(pedido.params.num2);
    const op = pedido.params.operacao;
    let result;
    console.log(result);
    console.log(op);

    if (op == "soma") {
      soma(num1, num2, function (resultado) {
        console.log(resultado);
        var data = {
          resultado: resultado,
        };
        return data;
      });
    }
  },
});

Aqui, dentro do if que verifica se a operação é uma soma, chamamos a nova versão da função "soma", passando os dois números e uma função de callback que recebe o resultado da soma e retorna o objeto "data" que será enviado como resposta ao cliente.

Com essas modificações, sua função de middleware irá aguardar o resultado da soma antes de enviar a resposta ao cliente, garantindo que ele irá receber apenas o resultado correto da operação solicitada.

Espero que tenha te ajudado.

Um abraço e bons estudos.