1

Tengo una función Prueba2(), que debería setear el valor a una variable 'b' dependiendo del valor que retorne Prueba(). Pero me toma como undefined a b, y solo se solucionarlo si paso los valores con una variable global ('c' en este caso). Hay alguna forma de hacer eso sin pasar los valores por la variable global? Este es mi código (PD: el WM únicamente retorna un true):

var c = false;
function prueba2() {
var b = false;
b = prueba();
d = c;
debugger;
}
function prueba() {
var a = false;
$.ajax({
    type: 'POST',
    url: '/ABM/Cliente.aspx/PruebaWM',
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    async: false,
    success: function (msg) {
        debugger;
        a = msg.d;
        c = msg.d;
        return c;
    },
    error: function () {

    }
});
}
jsdnlb
  • 2,479
  • 12
  • 34
iMSn20
  • 533
  • 3
  • 18

3 Answers3

5

Eso te pasa porque var define el scope de las variables de una forma distinta a let y a const.

Tu problema se solucionar cambiando var b = false; por let b = false;

Te dejo un link a la documentación para que leas la teoria. Saludos

https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Sentencias/let https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Sentencias/var https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Sentencias/const

Agustin G.
  • 1,946
  • 8
  • 25
  • 1
    Hola, gracias por la respuesta. No me funciono utilizando let b = false; Sigue siendo indefinida. Se declara bien el valor al prinicipio, pero una vez que trato de asignarle el valor que devuelvue prueba() pasa a indefinido – iMSn20 Dec 24 '19 at 14:49
4

Hola tengo entendido que la funcion success siempre devuelve undefined. Y por lo tanto no se le asigna el dato correcto a la variable b. Lo que puedes hacer es pasar una funcion callback a la funcion prueba y recibir los datos devueltos. de esta manera.

var c = false;
    function prueba2() {
        var b = false;

        prueba(function(errorLanzado,datoDevuelto){
            if(errorLanzado){
                return;
            }
            a = datoDevuelto.d;
            c = datoDevuelto.d;

            b = datoDevuelto.d;
        });

        d = c;
        //debugger;
        console.log('El valor de b es: '+b);
    }

    function prueba(funCallBack) {
        var a = false;
        $.ajax({
            type: 'POST',
            url: '/ABM/Cliente.aspx/PruebaWM',
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            async: false,
            success: function (msg) {
                funCallBack(null,msg);
            },
            error: function (error) {
                console.log(error);
            }
        });
    }

Espero el comentario de los usuarios.

  • Hola, gracias por la respuesta. Me funciono, ahora si me devuelve el valor. Lo de let no me lo solucionaba. Te hago otra consulta, si saco el async: false, no puedo obtener el valor porque se sigue ejecutando sin esperar el resultado del web method. Hay alguna forma de dejarlo que sea una funcion asincrona pero que obtenga le resultado igual? – iMSn20 Dec 24 '19 at 15:25
-1
var c = false;
    function prueba2() {
        var b = false;

        prueba(function(errorLanzado,datoDevuelto){
            if(errorLanzado){
                return;
            }
            a = datoDevuelto.d;
            c = datoDevuelto.d;

            b = datoDevuelto.d;
        });

        d = c;
        //debugger;
        console.log('El valor de b es: '+b);
    }

    function prueba(funCallBack) {
        var a = false;
        $.ajax({
            type: 'POST',
            url: '/ABM/Cliente.aspx/PruebaWM',
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            async: false,
            success: function (msg) {
                funCallBack(null,msg);
            },
            error: function (error) {
                console.log(error);
            }
        });
    }
BetaM
  • 30,571
  • 7
  • 32
  • 50
R B
  • 1