2
respostas

Dúvidas sobre Function Async

Boa noite, estou com problema em um projeto node.js onde faço uma chamada para um web-service, porem não estou conseguindo jogar o resultado para o response da pagina.

Segue codigo da function:

function callSoapService(wsdl, methodName, args, fn)
{
     soap.createClient(wsdl, function(err, client) {
        client[methodName](args, function(err, result) {
          fn(result.situacaodopedidoReturn);
        });
    });
}

E aqui esta a chamada da function

    var msg;

callSoapService(wsdl, 'situacaodopedido', {cliente}, 
      function (result) {
              console.log(result);                
              msg = result;
      });

      response.output.text = msg;

no console.log obtenho o resultado do web service, porem não estou conseguindo passar esse resultado para a variavel msg, pois tenho que retorno essa valor para o response.output.text

sei que essa function é async, mas ainda não entendi como faço para usa-la no meu projeto já que o retorno esta dentro de uma funtion sync.

Grato.

2 respostas

Olhando este trecho de código :

 var msg;

callSoapService(wsdl, 'situacaodopedido', {cliente}, 
      function (result) {
              console.log(result);                
              msg = result;
      });

      response.output.text = msg;

O que ocorre é o seguinte, a variável msg começa com o valor vazio, ela somente é preenchida se houver consumo do webservice. Como a execução do código não espera o retorno do webservice, msg vai continuar vazio, e o campo output vai receber este valor.

Teria que fazer o response somente depois de receber o retorno.

insira seu código aquivar msg;
callSoapService(wsdl, 'situacaodopedido', {cliente}, 
      function (result) {
              console.log(result);                
              msg = result;
 response.output.text = msg;
      });

Coloquei o response.output.text - msg dentro da function, mas não aparece nada na tela, esse chamada ocorre dentro de uma outra função que retorna o reponse

function updateMessage(input, response) {
  var responseText = null;
  var msg;

  if (!response.output) {
    response.output = {};
  } else {

    if (response.output.acao === "localizar_pedidos") {
        var cliente = response.input.text.replace(/[^0-9]/g,'');

    callSoapService(wsdl, 'situacaodopedido', {cliente}, 
      function (result) {
        console.log(result);                
        msg = result;
        response.output.text = msg;
        console.log(response);
      });
    } 

    console.log(response);

      return response;    
  }

  if (response.intents && response.intents[0]) {
    var intent = response.intents[0];
    if (intent.confidence >= 0.75) {
      responseText = 'Eu entendi que você quer ' + intent.intent;
    } else if (intent.confidence >= 0.5) {
      responseText = 'Eu acho que você quis dizer ' + intent.intent;
    } else {
      responseText = 'Eu nao entendi sua o que você disse';
    }
  }

  response.output.text = responseText;
  return response;
}

o response de dentro da chamada do web-service tem o output.text preenchido com o retorno do web-service, porem o response que esta fora da chamada, e este é o retorno da função principal não tem. Era pra ser o mesmo response, porem acredito que para funções assíncrona o processo é diferente.