2

Tengo una función que obtiene el nombre de un rango dependiendo de una facción en la base de datos

function nombreRango(rango, org){
    const dataOrg = {
        memberRange: rango,
        memberOrg: org
    };
    $.post('/cargarDatos.php', dataOrg, function (response) {
        rangoArray = JSON.parse(response);
        rangoName = rangoArray[0].rangoName;
        console.log(nombreRango);
        return rangoName;
    })
}

Al momento de hacer console.log(nombreRango); me muestra el nombre del rango correctamente, pero al hacer return nombreRango; se inserta en la tabla con el texto "undefined".

Este es el backend

        $memberRange = $_POST['memberRange'];
        $memberOrg = $_POST['memberOrg'];

        $query = "SELECT * FROM tabla WHERE Nombre = '$memberOrg'";
        $result = mysql_query($query);
        if ($result !== false) {
            $value = mysql_fetch_array($result);
            $rangoString = "Rango" . $memberRange;
            $datos[] = array(
                'rangoName' => $value[$rangoString],
                'datoX' => 'X'
            );
            $jsonstring = json_encode($datos);
            echo $jsonstring;
        }

3 Answers3

2

Al hacer una llamada a servidor asíncrona, "nos salimos" del flujo de ejecución mientras el hilo principal sigue adelante. Ten en cuenta que esa función asíncrona que "se sale" del flujo puede tardar n segundos y en ese tiempo, el hilo principal ha seguido su flujo. Por lo tanto, y visto de esta manera, es normal que no se pueda retornar cuando una función ejecuta código asíncrono.

En tu caso, para poder manejar el valor de rangoName podrías, por ejemplo, crear otra función que implemente la lógica que desees:

function nombreRango(rango, org){
    const dataOrg = {
        memberRange: rango,
        memberOrg: org
    };
    $.post('/cargarDatos.php', dataOrg, function (response) {
        rangoArray = JSON.parse(response);
        rangoName = rangoArray[0].rangoName;
        console.log(rangoName);
        DoSomethingRangoName(rangoName);
    })
}

function DoSomethingRangoName(rangoName) {
    // DoSomething
}
zeross
  • 1,428
  • 12
  • 22
  • zeross, la ídea de la función es obtener el nombre del rango (almacenado en la base de datos) y con esto llenar una tabla con esto. Por eso necesito el `return` ¿Existe alguna alternativa? – Carlos Alberto Marrufo Sep 13 '19 at 09:44
  • Pues la idea es que te crees una función, llamemosla por ejemplo `llenarTabla()`, en la que, recibiendo el parámetro `rangoName`, llenes la tabla – zeross Sep 14 '19 at 06:21
0

Una función devuelve undefined si no se ha devuelto un valor. En la función nombreRango, debes tener un return en su cuerpo.

Jean Gotopo
  • 1,040
  • 1
  • 10
  • 27
  • 1
    La función tiene su `return` intenté poniéndolo fuera del `$.post` e igual me da undefined, deje uno dentro y otro fuera y me da vacío. – Carlos Alberto Marrufo Sep 13 '19 at 04:53
  • 1
    Por favor no coloques código como imagen, pégalo como texto, seleccionalo y presiona `ctrl + k` para darle formato – BetaM Sep 13 '19 at 04:54
0

Investigando me di cuenta que tenía que cambiar $.post por $.ajax y la función quedó de este modo

const dataOrg = {
    memberRange: rango,
    memberOrg: org,
    verRango : "verRango"
}
$.ajax({
    type: "POST",
    url: '/CargarDatos.php',
    data: dataOrg,
    success: function (response) {
        rangoArray = JSON.parse(response);
        rangoName = rangoArray[0].rangoName;
    }, 
    async: false
    })
return rangoName;
  • Ten cuidado. Te funciona porque te estás cargando la asincronía. Según jQuery está desaconsejado. – zeross Sep 13 '19 at 07:56
  • 1
    Según jQuery y según cualquier navegador: te mostrará un warning durante la ejecución – Pablo Lozano Sep 13 '19 at 08:03
  • Usé respuesta de zeross, gracias por sus comentarios. Dejaré la respuesta por si alguien llega a tener este error y opta por mi opción, sepa por sus comentarios que no es recomendable. Muchas gracias a ambos. – Carlos Alberto Marrufo Sep 13 '19 at 09:08